MINA 實現聊天功能

2021-07-01 18:23:58 字數 3084 閱讀 3825

原文同步至

在《mina 快速入門》一文中,我們介紹了如何利用 mina 快速構建乙個 time server(時間伺服器)。在《netty 實現聊天功能》一文,我們也介紹了如何用 netty 實現聊天功能。由於 mina 和 netty 是同乙個作者,架構類似,如果你掌握其中乙個,學習另外乙個也不是難事。現在我們就用 mina 來實現聊天功能。

讓我們從 handler (處理器)的實現開始,handler 是由 mina 生成用來處理 i/o 事件的, 處理器繼承自 iohandleradapter。

public class ******chatserverhandler extends iohandleradapter 

@override

public void sessionclosed(iosession session) throws exception

@override

public void messagereceived(iosession session, object message)

throws exception

@override

public void sessionidle(iosession session, idlestatus status)

throws exception

@override

public void exceptioncaught(iosession session, throwable cause)

/*** 廣播訊息

* * @param message

*/private void broadcast(string message, iosession exceptsession) else }}

}}

}

1.******chatserverhandler 繼承自 iohandleradapter,這個類實現了 iohandler 介面,iohandleradapter 提供了許多事件處理的介面方法,然後你可以覆蓋這些方法。現在僅僅只需要繼承 iohandleradapter 類而不是你自己去實現介面方法。

2.setsessions用來儲存所有的 連線上來的 session.

3.覆蓋了 sessioncreated() 事件處理方法。每當從服務端收到新的客戶端連線時,客戶端的 iosession 就存入存入 sessions 列表中,並通知列表中的其他客戶端 iosession

4.覆蓋了 sessionclosed() 事件處理方法。每當從服務端收到客戶端斷開時,客戶端的 iosession 從 sessions 列表中,並通知列表中的其他客戶端 iosession

5.覆蓋了 messagereceived() 事件處理方法。每當從服務端讀到客戶端寫入資訊時,將資訊廣播給其他客戶端的 iosession。

6.覆蓋了 sessionidle() 事件處理方法。服務端監聽到客戶端閒置情況

7.exceptioncaught() 事件處理方法是當出現 throwable 物件才會被呼叫,即當 mina 由於 io 錯誤或者處理器在處理事件時丟擲的異常時。在大部分情況下,捕獲的異常應該被記錄下來並且把關聯的 iosession 給關閉掉。然而這個方法的處理方式會在遇到不同異常的情況下有不同的實現,比如你可能想在關閉連線之前傳送乙個錯誤碼的響應訊息。

8.broadcast() 伺服器用於廣播的方法

編寫乙個 main() 方法來啟動服務端。

public class ******chatserver  else 

socketacceptor acceptor = new niosocketacceptor(); // (1)

acceptor.getfilterchain().addlast( "codec",

new protocolcodecfilter( new textlinecodecfactory( charset.forname( "utf-8" )))); // (2)

acceptor.sethandler(new ******chatserverhandler()); // (3)

acceptor.getsessionconfig().setreadbuffersize(2048); // (4)

acceptor.getsessionconfig().setidletime(idlestatus.both_idle, 100);// (5)

try catch (ioexception e)

system.out.println("[server]listening on port " + port);}}

1.niosocketacceptor 基於 tcp/ip 的 socket 連線。

2.protocolcodecfilter 是編碼和解碼的過濾器鏈,將乙個連入的 bytebuffer 轉化為訊息 pojo,反之亦然。而textlinecodecfactory是 mina 提供的乙個編譯碼是,可以方便處理基於文字的協議。

3.設定在處理器為之前建立的 ******chatserverhandler。

4.會話配置,設定位元組快取大小。

5.會話配置,設定閒置時間。

6.剩下的就是繫結埠然後啟動服務。這裡我們在機器上預設繫結了機器所有網絡卡上的 8080 埠。

恭喜!你已經完成了基於 mina 聊天服務端程式。

客戶端的處理模擬較簡單,只需要將讀到的資訊列印出來即可

public class ******chatclienthandler extends iohandleradapter 

}

編寫乙個 main() 方法來啟動客戶端。

public class ******chatclient  catch (ioexception e) }}

}

1.niosocketconnector 用於 tcp/ip 連線

2.連線到指定的伺服器

先執行 ******chatserver,再可以執行多個 ******chatclient,控制台輸入文字繼續測試

見 中******chat

php聊天功能 php怎麼實現聊天功能

php怎麼實現聊天功能 1 在前端使用ajax定時輪詢訪問php指令碼,php再進行查詢聊天資料進行返回給前端,最後前端將其進行渲染 示例 聊天室 function function getdata msg function data function data alert event.client...

php聊天功能 php實現簡單聊天功能

php實現簡單聊天功能 1 建立聊天訊息表,其表的字段有訊息內容,傳送時間和傳送者的名稱 sql create table guanhui message id int 10 not null auto increment comment 訊息id content varchar 255 not n...

python socket 簡單實現聊天功能

今天看了下python的socket,想實現下兩台電腦的聊天功能 覺得這樣好像自己寫出個簡易版qq沒問題了 於是動手開始實現。首先是伺服器端 from socket import from time import ctime host port 80 埠號,伺服器與客戶端要一致 bufsiz 102...