Java中使用websocket實現線上聊天功能,websocket線上聊天

來源:互聯網
上載者:User

Java中使用websocket實現線上聊天功能,websocket線上聊天

很早以前為了快速達到效果,使用輪詢實現了線上聊天功能,後來無意接觸了socket,關於socket我的理解是處理序間通訊,首先要有伺服器跟用戶端,服務的啟動監聽某ip連接埠定位該進程,用戶端開啟socket分配ip連接埠串連服務端ip連接埠,於是兩個進程間便可以通訊了。下面簡單畫個圖理解。

 

but,今天還是準備分享websocket的使用,先上效果,再貼代碼。

第一步啟動socket服務。

 

然後串連用戶端串連伺服器,加入聊天室,分別使用googel(白玉京,沈浪),Firefox(楚留香),ie(李尋歡)進行測試,效果如下。

 

*

*****************斷開一下。

 

******************斷開一下。

 

下面是本次測試源碼。

服務端:

 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; }    }  }

用戶端:

@{  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實現線上聊天功能,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對幫客之家網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.