最近在學習服務器,而對JAVA又比較熟悉的我就開始了學習服務器了。可能很多人會說還是用c++吧,不錯現在很多大型遊戲公司都是用C++的。這裏我不得不說我的C++ 真的很一般了。所以這裏先學java吧,其實語言也在學習的時候沒必要太糾結了!廢話太多了,開始入正題了。
本節目錄
1 :有用網站
2 :準備資源
3 :環境搭建
4 :Demo測試
首先說一下爲什麼我這裏要選擇Mina ,1:Mina是開源的(我一般都會選擇開源的框架的)
2:Apache 用了很多他的框架,一般來說還是很穩定的。 所以我選擇了Mina 。橫向比較現在用的比較多的還有netty ,XSocket 等等。
Mina 的作用: 它是封裝了JavaNIO(如果對JavaNIO不瞭解的可以再網上找一些資料來看一下,如果這個都沒弄明白的話後面就很難繼續了,所以建議先打好基礎)
的一個開源框架,更利於我們開發java 服務器。
1 :有用網站
. 官方網站http://mina.apache.org/
2 :準備資源
. 搭建Mina 環境必備的資源有 : mina-core-2.0.7.jar , slf4j-api.jar , log4j.jar , slf4j-simple.jar (分別去官網下載吧,版本號這裏可能不同以最新的爲準,如果實在不知道下載的可以私聊我給你)
3 :環境搭建
. java 環境
學習java 的都應該清楚的,JDK 下載 ; 環境變量配置 ; Eclipse 下載
. Mina 環境
以外部包的方式導入上面準備的4個資源(右鍵項目:build path / configuare build path / add external jars ) 導入後如下結構圖,表明我們的環境搭建好了。
- Referenced Libraries
-mina-core-2.0.7.jar
- slf4j-api.jar
- log4j.jar
- slf4j-simple.jar
4 :Demo測試
Server 端
. 創建Server
- public class MinaServer
- {
- public static void main(String[] args)
- {
- //創建ServerScoket
- SocketAcceptor acceptor = new NioSocketAcceptor();
- //設置傳輸方式(這裏設置成對象傳輸模式,還有很多的類型後面會具體講到
- DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
- ProtocolCodecFilter filter = new ProtocolCodecFilter(
- new ObjectSerializationCodecFactory());
- chain.addLast("objectFilter", filter);
- // 添加消息處理
- acceptor.setHandler(new MinaServerHanlder());
- // 開啓服務器
- int bindPort = 9988;
- try {
- acceptor.bind(new InetSocketAddress(bindPort));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
. 創建消息處理類
- <p>import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IdleStatus;
- import org.apache.mina.core.session.IoSession;</p><p>public class MinaServerHanlder extends IoHandlerAdapter {
- private int count = 0;</p><p> // 由底層決定是否創建一個session
- public void sessionCreated(IoSession session) {
- System.out.println("新客戶連接");
- }</p><p> // 創建了session 後會回調sessionOpened
- public void sessionOpened(IoSession session) throws Exception {
- count++;
- System.out.println("第 " + count + " 個 client 登陸!address: : "
- + session.getRemoteAddress());
- }</p><p> // 當收到了客戶端發送的消息後會回調這個函數
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- System.out.println("服務器收到客戶端發送指令 :" + message);</p><p> }</p><p> // 發送成功後會回調的方法
- public void messageSent(IoSession session, Object message) {
- System.out.println("message send to client");
- }</p><p> // session 關閉調用
- public void sessionClosed(IoSession session) {
- System.out.println("one client disconnect");
- }</p><p> // session 空閒的時候調用
- public void sessionIdle(IoSession session, IdleStatus status) {
- System.out.println("connect idle");
- }</p><p> // 異常捕捉
- public void exceptionCaught(IoSession session, Throwable cause) {
- System.out.println("throws exception");
- }
- }</p>
Client 端
Client 端的創建方式和服務器類似的
創建客戶端
- import java.net.InetSocketAddress;
- import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
- import org.apache.mina.core.future.ConnectFuture;
- import org.apache.mina.filter.codec.ProtocolCodecFilter;
- import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
- import org.apache.mina.transport.socket.nio.NioSocketConnector;
- public class MinaClient {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- // 創建Socket
- NioSocketConnector connector = new NioSocketConnector();
- //設置傳輸方式
- DefaultIoFilterChainBuilder chain = connector.getFilterChain();
- ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
- chain.addLast("objectFilter", filter);
- //設置消息處理
- connector.setHandler(new MinaClientHanlder());
- //超時設置
- connector.setConnectTimeoutCheckInterval(30);
- //連接
- ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988));
- cf.awaitUninterruptibly();
- cf.getSession().getCloseFuture().awaitUninterruptibly();
- connector.dispose();
- }
- }
創建客戶端消息處理
- <p>import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IoSession;</p><p>
- public class MinaClientHanlder extends IoHandlerAdapter {
- public void sessionOpened(IoSession session) throws Exception {
- System.out.println("客戶端登陸");
- session.write("hello world");
- }
- public void sessionClosed(IoSession session)
- {
- System.out.println("client close");
- }
- public void messageReceived(IoSession session , Object message)throws Exception
- {
- System.out.println("客戶端接受到了消息") ;
- }
- }</p><strong>運行結果</strong>
server :
新客戶連接
第 1 個 client 登陸!address: : /127.0.0.1:55497
服務器收到客戶端發送指令 :hello world
client :
客戶端登陸
後記 :本來想上傳圖片的,可惜CSDN 這個上傳圖片那叫一個慢啊。無奈了....如果有什麼問題可以回覆我。
原文:http://blog.csdn.net/pdw_jsp/article/details/8603224