很早以前為了快速達到效果,使用輪詢實現了在線聊天功能,后來無意接觸了socket,關于socket我的理解是進程間通信,首先要有服務器跟客戶端,服務的啟動監聽某ip端口定位該進程,客戶端開啟socket分配ip端口連接服務端ip端口,于是兩個進程間便可以通信了。下面簡單畫個圖理解。
but,今天還是準備分享websocket的使用,先上效果,再貼代碼。
第一步啟動socket服務。
然后連接客戶端連接服務器,加入聊天室,分別使用googel(白玉京,沈浪),火狐(楚留香),ie(李尋歡)進行測試,效果如下。
*
*****************斷開一下。
******************斷開一下。
下面是本次測試源碼。
服務端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
public class testwebsocketcontroller : controller { websocketserver server; list<sessioninfo> listsession = new list<sessioninfo>(); public actionresult index() { return view(); } //服務啟動 public string start() { var ip = "192.168.1.106" ; var port = "1010" ; server = new websocketserver(); if (!server.setup(ip, int .parse(port))) { return "websocket服務啟動error" ; } //新的會話連接 server.newsessionconnected += sessionconnected; //會話關閉 server.sessionclosed += sessionclosed; //新的消息接收 server.newmessagereceived += messagereceived; if (!server.start()) { //處理監聽失敗消息 return "error" ; } return "success" ; } /// <summary> /// 會話關閉 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private void sessionclosed(websocketsession session, supersocket.socketbase.closereason value) { debug.writeline( "會話關閉,關閉原因:{0} 來自:{1} 時間:{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> /// 會話連接 /// </summary> /// <param name="session"></param> private void sessionconnected(websocketsession session) { debug.writeline( "新的會話連接 來自:{0} sessionid:{1} 時間:{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) { //反序列化消息內容 var message = jsonconvert.deserializeobject<messageinfo>(value); foreach (var item in listsession) { ///發送消息 sendmsg(item.sessionid, string.format( "{0}發來消息:{1}" , message.name, message.message)); } } // <summary> /// 發送消息 /// </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; } } } |
客戶端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
@{ 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= "發送" 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( "瀏覽器版本過低,請升級您的瀏覽器" ); //注冊各類回調 ws.onopen = function () { $( "#msg" ).append($( "#txtname" ).val() + "加入聊天室<br />" ); } ws.onclose = function () { $( "#msg" ).append($( "#txtname" ).val() + "離開聊天室<br />" ); } ws.onerror = function () { $( "#msg" ).append( "數據傳輸發生錯誤<br />" ); } ws.onmessage = function (receivemsg) { $( "#msg" ).append(receivemsg.data + "<br />" ); } //監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口,server端會拋異常。 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> |
總結
以上所述是小編給大家介紹的java中使用websocket實現在線聊天功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/baiyujing/p/8458567.html