Java中使用websocket實(shí)現(xiàn)在線聊天功能
很早以前為了快速達(dá)到效果,使用輪詢實(shí)現(xiàn)了在線聊天功能,后來(lái)無(wú)意接觸了socket,關(guān)于socket我的理解是進(jìn)程間通信,首先要有服務(wù)器跟客戶端,服務(wù)的啟動(dòng)監(jiān)聽某ip端口定位該進(jìn)程,客戶端開啟socket分配ip端口連接服務(wù)端ip端口,于是兩個(gè)進(jìn)程間便可以通信了。下面簡(jiǎn)單畫個(gè)圖理解。
but,今天還是準(zhǔn)備分享websocket的使用,先上效果,再貼代碼。
第一步啟動(dòng)socket服務(wù)。
然后連接客戶端連接服務(wù)器,加入聊天室,分別使用googel(白玉京,沈浪),火狐(楚留香),ie(李尋歡)進(jìn)行測(cè)試,效果如下。
*
*****************斷開一下。
******************斷開一下。
下面是本次測(cè)試源碼。
服務(wù)端:
public class TestWebSocketController : Controller { WebSocketServer server; List<SessionInfo> listSession = new List<SessionInfo>(); public ActionResult Index() { return View(); } //服務(wù)啟動(dòng) public string Start() { var ip = "192.168.1.106"; var port = "1010"; server = new WebSocketServer(); if (!server.Setup(ip, int.Parse(port))) { return "WebSocket服務(wù)啟動(dòng)Error"; } //新的會(huì)話連接 server.NewSessionConnected += SessionConnected; //會(huì)話關(guān)閉 server.SessionClosed += SessionClosed; //新的消息接收 server.NewMessageReceived += MessageReceived; if (!server.Start()) { //處理監(jiān)聽失敗消息 return "error"; } return "success"; } /// <summary> /// 會(huì)話關(guān)閉 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private void SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value) { Debug.WriteLine("會(huì)話關(guān)閉,關(guān)閉原因:{0} 來(lái)自:{1} 時(shí)間:{2:HH:MM:ss}", value, session.RemoteEndPoint, DateTime.Now); //SendMsgToRemotePoint(SessionId, SessionId + "已斷開"); var sessionRemove = listSession.FirstOrDefault(s => s.SessionId == session.SessionID); listSession.Remove(sessionRemove); } /// <summary> /// 會(huì)話連接 /// </summary> /// <param name="session"></param> private void SessionConnected(WebSocketSession session) { Debug.WriteLine("新的會(huì)話連接 來(lái)自:{0} SessionID:{1} 時(shí)間:{2:HH:MM:ss}", session.RemoteEndPoint, session.SessionID, DateTime.Now); listSession.Add(new SessionInfo { SessionId = session.SessionID, EndPoint = session.RemoteEndPoint.ToString() }); } /// <summary> /// 消息接收 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private void MessageReceived(WebSocketSession session, string value) { //反序列化消息內(nèi)容 var message = JsonConvert.DeserializeObject<MessageInfo>(value); foreach (var item in listSession) { ///發(fā)送消息 SendMsg(item.SessionId, string.Format("{0}發(fā)來(lái)消息:{1}", message.Name, message.Message)); } } // <summary> /// 發(fā)送消息 /// </summary> /// <param name="sessionId"></param> /// <param name="msg"></param> private void SendMsg(string sessionId, string msg) { var appSession = server.GetAppSessionByID(sessionId); if (appSession != null) appSession.Send(msg); } public class MessageInfo { public string Name { get; set; } public string Message { get; set; } } public class SessionInfo { public string SessionId { get; set; } public string EndPoint { get; set; } //public string Name { get; set; } } }
客戶端:
@{ ViewBag.Title = "Index"; } <h2>Index</h2> <script src="../Scripts/jquery-1.8.2.js"></script> <input type="text" id="txtName" /> <input type="button" value="加入聊天室" id="btnConnection" /> <input type="button" value="離開聊天室" id="btnDisConnection" /> <input type="text" id="txtInput" /> <input type="button" value="發(fā)送" id="btnSend" /> <div id="msg"></div> <script language="javascript" type="text/javascript"> var ws; var url = "ws://192.168.1.106:1010" $("#btnConnection").click(function () { if ("WebSocket" in window) { ws = new WebSocket(url); } else if ("MozWebSocket" in window) { ws = new MozWebSocket(url); } else alert("瀏覽器版本過(guò)低,請(qǐng)升級(jí)您的瀏覽器"); //注冊(cè)各類回調(diào) ws.onopen = function () { $("#msg").append($("#txtName").val() + "加入聊天室<br />"); } ws.onclose = function () { $("#msg").append($("#txtName").val() + "離開聊天室<br />"); } ws.onerror = function () { $("#msg").append("數(shù)據(jù)傳輸發(fā)生錯(cuò)誤<br />"); } ws.onmessage = function (receiveMsg) { $("#msg").append(receiveMsg.data + "<br />"); } //監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會(huì)拋異常。 window.onbeforeunload = function () { ws.close(); } }); //$("#btnDisConnection").click(function () { // $("#msg").append($("#txtName").val() + "離開聊天室<br />"); // ws.close(); //}); $("#btnSend").click(function () { if (ws.readyState == WebSocket.OPEN) { var message = "{\"name\":\"" + $("#txtName").val() + "\",\"message\":\"" + $("#txtInput").val() + "\"}"; ws.send(message); } else { $("#msg").text("Connection is Closed!"); } }); </script>
總結(jié)
以上所述是小編給大家介紹的Java中使用websocket實(shí)現(xiàn)在線聊天功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
使用IDEA異常斷點(diǎn)來(lái)定位java.lang.ArrayStoreException的問(wèn)題
這篇文章主要介紹了使用IDEA異常斷點(diǎn)來(lái)定位java.lang.ArrayStoreException的問(wèn)題,平常開發(fā)過(guò)程中面對(duì)這種描述不夠清楚,無(wú)法定位具體原因的問(wèn)題該如何處理,下面我們來(lái)一起學(xué)習(xí)一下吧2019-06-06springboot 獲取訪問(wèn)接口的請(qǐng)求的IP地址的實(shí)現(xiàn)
本文主要介紹了springboot獲取訪問(wèn)接口的請(qǐng)求的IP地址的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07解決java.lang.ClassCastException的java類型轉(zhuǎn)換異常的問(wèn)題
這篇文章主要介紹了解決java.lang.ClassCastException的java類型轉(zhuǎn)換異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09SpringBoot使用Jwt處理跨域認(rèn)證問(wèn)題的教程詳解
這篇文章主要介紹了SpringBoot使用Jwt處理跨域認(rèn)證問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Java解決前端數(shù)據(jù)處理及亂碼問(wèn)題
大伙們有沒有遇到數(shù)據(jù)亂碼的問(wèn)題,真的是讓人心情煩躁,今天就來(lái)教下大家數(shù)據(jù)怎么傳輸?shù)角岸艘约皝y碼問(wèn)題怎么解決的,需要的朋友可以參考一下2021-12-12Spring框架學(xué)習(xí)之Spring?@Autowired實(shí)現(xiàn)自動(dòng)裝配的代碼
自動(dòng)裝配就是說(shuō),你不用手動(dòng)實(shí)現(xiàn)bean之間的組合關(guān)系,只要使用了@Autowired注解,程序就會(huì)自動(dòng)的注入這個(gè)需要的bean,前提是你的Spring容器有這個(gè)bean,這篇文章主要介紹了Spring?@Autowired實(shí)現(xiàn)自動(dòng)裝配,需要的朋友可以參考下2021-12-12java實(shí)現(xiàn)收藏名言語(yǔ)句臺(tái)詞的app
本文給大家分享的是使用java制作的記錄名人名言臺(tái)詞等等讓你難忘的語(yǔ)句的APP的代碼,非常的實(shí)用,有需要的小伙伴可以參考下。2015-04-04