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

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

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

第一步启动socket服务。

然后连接客户端连接服务器,加入聊天室,分别使用googel(白玉京,沈浪),火狐(楚留香),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实现在线聊天功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例
  • 使用Java和WebSocket实现网页聊天室实例代码
  • 使用JavaWeb webSocket实现简易的点对点聊天功能实例代码
  • Java后端Tomcat实现WebSocket实例教程
  • java中实现兼容ie6 7 8 9的spring4+websocket
(0)

相关推荐

  • 使用Java和WebSocket实现网页聊天室实例代码

    在没介绍正文之前,先给大家介绍下websocket的背景和原理: 背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更

  • 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例

    前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前的服务器消息推送大部分采用的都是"轮询"和"长连接"技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高.WebSocket技术对只会产生很小的开销,并且实时性特别高.下面就开始讲解如何利用WebSocket技术开发聊天室.在这个实例中,采用的是Tomcat7服务器,每个服务器对于WebSoc

  • Java后端Tomcat实现WebSocket实例教程

    一.WebSocket简单介绍 WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).一开始的握手需要借助HTTP请求完成握手. 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据. WebSocket背景 在浏览器中通过http仅能实现单向的

  • java中实现兼容ie6 7 8 9的spring4+websocket

    效果 不支持websocket的浏览器,用flash模拟websocket.当然,也可以用flash socket直接与服务端socket连接. 事实上,websocket协议比较简单,用actionscript模拟也比较简单,这个在本屌的另外一篇文章让ie6 7 8 9支持html5 websocket简单说了下. 另外,spring为sockjs 提供api,只需简单配置下,就可以兼容低版本浏览器,原理是用js模拟websocket object.具体的本屌还没有去看. 几点说明: 1.使用

  • 使用JavaWeb webSocket实现简易的点对点聊天功能实例代码

    首先给大家声明一点:需要 jdk 7 , tomcat需要支持websocket的版本  1.InitServlet 该类主要是用来初始化构造将来存储用户身份信息的map仓库,利用其初始化方法Init 初始化仓库, 利用其静态方法getSocketList 获得对应的用户身份信息. webSocket ,我认为MessageInbound 用来识别登录人的信息,用它来找到对应的人,推送消息.每次登录都会产生一个MessageInbound. 这里的 HashMap<String,MessageI

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

    很早以前为了快速达到效果,使用轮询实现了在线聊天功能,后来无意接触了socket,关于socket我的理解是进程间通信,首先要有服务器跟客户端,服务的启动监听某ip端口定位该进程,客户端开启socket分配ip端口连接服务端ip端口,于是两个进程间便可以通信了.下面简单画个图理解. but,今天还是准备分享websocket的使用,先上效果,再贴代码. 第一步启动socket服务. 然后连接客户端连接服务器,加入聊天室,分别使用googel(白玉京,沈浪),火狐(楚留香),ie(李寻欢)进行测试

  • 基于Java Socket实现一个简易在线聊天功能(一)

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到我们平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首

  • Java实现在线聊天功能

    本文实例为大家分享了Java实现在线聊天功能的具体代码,供大家参考,具体内容如下 效果 关键代码 创建Client.java import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; /**  * @author Lete  * @乐特的程序永无BUG  * @createDate 2020- 07-04 22:13  *  * 1. SendThread 发送消息线程  *

  • Django使用channels + websocket打造在线聊天室

    Channels是Django团队研发的一个给Django提供websocket支持的框架,它同时支持http和websocket多种协议.使用channels可以让你的Django应用拥有实时通讯和给用户主动推送信息的功能. 演示效果如下所示: 什么是websocket? WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 WebSocket API

  • java Socket实现网页版在线聊天

    本文为大家分享了一个满足在线网页交流需求的实例,由于java Socket实现的网页版在线聊天功能,供大家参考,具体内容如下 实现步骤: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过a

  • C#用websocket实现简易聊天功能(服务端)

    C# 利用websocket实现简易聊天功能——服务端,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.NET FrameWork4 功能包含群聊,和私聊 界面 界面设计代码 namespace chat_server {     partial class Form1     {         /// <summary>         /// 必需的设计器变量.         /// </summary>         private System.Compo

  • 基于PHP实现一个简单的在线聊天功能

    目录 前端页面 数据库 实现思路 1.showPage() 2.newChat() 3.getChatText() 4.getChatTemp() 5.pushChat() 总结 要实现功能,首先要做前端,经过对比其他网站的在线聊天功能,发现除了基本的聊天功能以外,还要注意以下几点. 一次只能和一个人聊天,但是可以随意切换其他人. 如果用户是从"发送消息" 入口进来的,那么当前马上就切换到对应的聊天窗口,而且如果之前有过聊天记录,应该把聊天记录也展示出来. 如果是从"我的消息

  • WPF+ASP.NET SignalR实现简易在线聊天功能的示例代码

    目录 涉及知识点 什么是ASP.NET SignalR 在线聊天整体架构 ASP.NET SignalR在线聊天服务端 1. 创建ASP.NET Web API项目 2. 创建消息通知中心Hub 3. 注册服务和路由 4. ASP.NET SignalR中心对象生存周期 SignalR客户端 1. 安装SignalR客户端依赖库 2. 客户端消息接收发送 运行示例 在实际业务中,当后台数据发生变化,客户端能够实时的收到通知,而不是由用户主动的进行页面刷新才能查看,这将是一个非常人性化的设计.有没

  • vue使用WebSocket模拟实现聊天功能

    效果展示 两个浏览器相互模拟 1.创建模拟node服务 在vue根目录下创建 server.js 文件模拟后端服务器 **在server终端目录下载 ** npm install --s ws 2.编写server.js文件 代码如下 var userNum = 0; //统计在线人数 var chatList = [];//记录聊天记录 var WebSocketServer = require('ws').Server; wss = new WebSocketServer({ port: 8

  • Vue+Websocket简单实现聊天功能

    本文实例为大家分享了Vue+Websocket简单实现聊天功能的具体代码,供大家参考,具体内容如下 效果图: 聊天室 此篇文章是针对Websocket的简单了解和应用,利用Nodejs简单搭建一个服务器加以实现. 首先创建一个vue项目 然后再创建一个server文件夹,在终端上打开该文件夹,输入vue init(一直敲 "回车" 键),最后再建一个server.js文件,如下图 代码如下: server.js/ 在server文件终端下 npm install --s ws var

随机推荐