Java中使用websocket实现在线聊天功能

作者:<天上白玉京> 时间:2023-01-03 22:07:20 

很早以前为了快速达到效果,使用轮询实现了在线聊天功能,后来无意接触了socket,关于socket我的理解是进程间通信,首先要有服务器跟客户端,服务的启动监听某ip端口定位该进程,客户端开启socket分配ip端口连接服务端ip端口,于是两个进程间便可以通信了。下面简单画个图理解。

Java中使用websocket实现在线聊天功能 

but,今天还是准备分享websocket的使用,先上效果,再贴代码。

第一步启动socket服务。

Java中使用websocket实现在线聊天功能 

然后连接客户端连接服务器,加入聊天室,分别使用googel(白玉京,沈浪),火狐(楚留香),ie(李寻欢)进行测试,效果如下。

Java中使用websocket实现在线聊天功能 

*

*****************断开一下。

Java中使用websocket实现在线聊天功能 

******************断开一下。

Java中使用websocket实现在线聊天功能 

下面是本次测试源码。

服务端:


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实现在线聊天功能网站的支持!

来源:http://www.cnblogs.com/baiyujing/p/8458567.html

标签:java,websocket
0
投稿

猜你喜欢

  • Java面向对象程序设计:类的定义,静态变量,成员变量,构造函数,封装与私有,this概念与用法详解

    2022-07-12 03:35:14
  • java实现扫雷游戏入门程序

    2023-04-24 16:20:40
  • JAVA 根据设置的概率生成随机数的方法

    2023-07-15 00:13:37
  • SpringBoot下使用定时任务的方式全揭秘(6种)

    2022-06-13 01:34:48
  • Java Condition条件变量提高线程通信效率

    2022-11-26 13:32:46
  • C# byte转为有符号整数实例

    2022-01-02 13:28:01
  • SpringCloud实现Redis在各个微服务的Session共享问题

    2022-07-14 06:33:19
  • C#ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决方法

    2021-06-04 20:11:14
  • Android 蓝牙BLE开发完全指南

    2023-07-03 03:15:06
  • 使用logback实现按自己的需求打印日志到自定义的文件里

    2022-05-12 16:56:49
  • C#使用默认浏览器打开网页的方法

    2022-02-16 10:39:34
  • Android开发使用Messenger及Handler进行通信的方法示例

    2022-02-23 23:35:22
  • 浅谈Android View滑动冲突的解决方法

    2021-12-17 06:47:09
  • JAVA利用递归删除文件代码实例

    2022-12-10 23:59:53
  • android实现简单左滑删除控件

    2023-11-10 03:01:29
  • C++日期类计算器的模拟实现举例详解

    2023-05-22 08:27:16
  • Android自定义Seekbar滑动条 Pop提示跟随滑动按钮滑动

    2021-11-02 20:32:06
  • Spring5学习之基础知识总结

    2021-08-16 02:19:15
  • Flutter 图片开发核心技能快速掌握教程

    2023-08-16 22:01:51
  • 将应用程序进行Spring6迁移的最佳使用方式

    2021-08-28 12:03:58
  • asp之家 软件编程 m.aspxhome.com