最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中使用websocket實(shí)現(xiàn)在線聊天功能

 更新時(shí)間:2018年02月22日 14:19:12   作者:<天上白玉京>  
這篇文章主要介紹了Java中使用websocket實(shí)現(xiàn)在線聊天功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

很早以前為了快速達(dá)到效果,使用輪詢實(shí)現(xiàn)了在線聊天功能,后來無意接觸了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} 來自:{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ì)話連接 來自:{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ā)來消息:{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("瀏覽器版本過低,請(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ì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • SpringMvc入門指南(必看)

    SpringMvc入門指南(必看)

    下面小編就為大家?guī)硪黄猄pringMvc入門指南(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • springBoot項(xiàng)目集成quartz開發(fā)定時(shí)任務(wù)案例及注意事項(xiàng)

    springBoot項(xiàng)目集成quartz開發(fā)定時(shí)任務(wù)案例及注意事項(xiàng)

    這篇文章主要介紹了springBoot項(xiàng)目集成quartz開發(fā)定時(shí)任務(wù)案例及注意事項(xiàng),這些功能的主要接口(API)是Scheduler接口。它提供了簡(jiǎn)單的操作,例如:將任務(wù)納入日程或者從日程中取消,開始/停止/暫停日程進(jìn)度,需要的朋友可以參考下
    2022-06-06
  • 淺談Java中ThreadLocal引發(fā)的內(nèi)存泄漏

    淺談Java中ThreadLocal引發(fā)的內(nèi)存泄漏

    本文主要介紹了淺談Java中ThreadLocal引發(fā)的內(nèi)存泄漏,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • maven父子工程中的依賴引用的實(shí)現(xiàn)

    maven父子工程中的依賴引用的實(shí)現(xiàn)

    本文主要介紹了Maven父子工程中的依賴引用的實(shí)現(xiàn),包括<dependencyManagement>和<dependencies>兩個(gè)標(biāo)簽的使用,以及父子pom文件的配置,感興趣的可以了解一下
    2024-10-10
  • SpringBoot整合TomCat實(shí)現(xiàn)本地圖片服務(wù)器代碼解析

    SpringBoot整合TomCat實(shí)現(xiàn)本地圖片服務(wù)器代碼解析

    這篇文章主要介紹了SpringBoot整合TomCat實(shí)現(xiàn)本地圖片服務(wù)器代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Mybatis查不到數(shù)據(jù)查詢返回Null問題

    Mybatis查不到數(shù)據(jù)查詢返回Null問題

    mybatis突然查不到數(shù)據(jù),查詢返回的都是Null,但是 select count(*) from xxx查詢數(shù)量,返回卻是正常的。好多朋友遇到這樣的問題不知所措,下面小編通過本教程簡(jiǎn)單給大家說明下
    2016-08-08
  • Java中處理I/O操作的不同方式

    Java中處理I/O操作的不同方式

    BIO、NIO和AIO是Java中處理I/O操作的三種不同方式,它們分別代表阻塞I/O、非阻塞I/O和異步I/O,本文我們結(jié)合代碼進(jìn)行一個(gè)綜合演示,代碼由于是偽代碼,可能存在不足,僅供大家參考
    2024-02-02
  • springboot讀取application.yml報(bào)錯(cuò)問題及解決

    springboot讀取application.yml報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了springboot讀取application.yml報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 如何為L(zhǎng)ogback日志添加唯一追蹤ID

    如何為L(zhǎng)ogback日志添加唯一追蹤ID

    本文介紹了如何為L(zhǎng)ogback日志添加唯一追蹤ID,以便在測(cè)試和調(diào)試時(shí)更容易定位報(bào)錯(cuò)信息,通過創(chuàng)建過濾器和修改配置文件,可以在每個(gè)請(qǐng)求的日志中添加唯一的ID,并將其返回給前端,這樣,當(dāng)用戶反饋報(bào)錯(cuò)時(shí),開發(fā)人員可以根據(jù)ID快速定位和解決問題
    2024-12-12
  • Java使用EasyExcel動(dòng)態(tài)添加自增序號(hào)列

    Java使用EasyExcel動(dòng)態(tài)添加自增序號(hào)列

    本文將介紹如何通過使用EasyExcel自定義攔截器實(shí)現(xiàn)在最終的Excel文件中新增一列自增的序號(hào)列,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評(píng)論

罗源县| 湘潭市| 南丰县| 三台县| 中西区| 玛曲县| 高要市| 精河县| 娱乐| 宝山区| 昌黎县| 崇文区| 澳门| 三明市| 和平县| 类乌齐县| 永顺县| 岑溪市| 紫金县| 肇庆市| 乌恰县| 郯城县| 开化县| 嘉荫县| 肇庆市| 高阳县| 凤翔县| 武冈市| 东丰县| 浙江省| 文成县| 固原市| 芜湖市| 招远市| 石阡县| 金寨县| 宁国市| 沈丘县| 威信县| 永和县| 上蔡县|