使用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 = "";
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>
使用websocket实现在线聊天功能的更多相关文章
- SpringBoot+Vue+WebSocket 实现在线聊天
一.前言 本文将基于 SpringBoot + Vue + WebSocket 实现一个简单的在线聊天功能 页面如下: 在线体验地址:http://www.zhengqingya.com:8101 二 ...
- 基于PHP实现一个简单的在线聊天功能(轮询ajax )
基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...
- Spring Websocket实现简易在线聊天功能
针对Spring Websocket的实现,我参照了其他博主的文章https://www.cnblogs.com/leechenxiang/p/5306372.html 下面直接给出实现: 一.引入相 ...
- 三分钟搭建websocket实时在线聊天,项目经理也不敢这么写
我们先看一下下面这张图: 可以看到这是一个简易的聊天室,两个窗口的消息是实时发送与接收的,这个主要就是用我们今天要讲的websocket实现的. websocket是什么? websocket是一种网 ...
- springboot+websocket实现简单的在线聊天功能
效果如下: java实现逻辑: 1.引入maven依赖 <dependency> <groupId>org.springframework.boot</groupId&g ...
- SSH 项目中 使用websocket 实现网页聊天功能
参考文章 :java使用websocket,并且获取HttpSession,源码分析 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 1.在项 ...
- .NET Core 基于Websocket的在线聊天室
什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...
- SpringBoot 使用WebSocket打造在线聊天室
教程: https://www.jianshu.com/p/55cfc9fcb69e https://wallimn.iteye.com/blog/2425666 关于websocket基础普及见:h ...
- UDP实现在线聊天功能
发送端 //发送 public class UDPChat01 { public static void main(String[] args) throws Exception { //开启端口 D ...
随机推荐
- [学习OpenCV攻略][016][RedHat下安装OpenCV]
安装环境 操作系统: Red Hat Enterprise Linux Server 6.3 相关软件: ffmpeg-0.8.15.tar.bz2.cmake-3.5.1.tar.gz.OpenCV ...
- [C#]使用控制台获取天气预报
本例子主要是使用由中央气象局网站(http://www.nmc.gov.cn)提供的JSON API,其实现思路如下: 1.访问获取省份(包含直辖市.自治区等,以下简称省份)的网址(http://ww ...
- 将本地项目或代码上传到别人GitHub(码云)的远程分支上
今天碰到了这样一个问题,折腾了半天,就是将自己本地代码上传到人家的远程分支上. 首先要做的就是先将人家的项目克隆到本地:git clone + 项目地址 然后进入项目目录:cd + 已克隆好的项目目录 ...
- N的N次方
题目描述 现给你一个正整数N,请问N^N的最左边的数字是什么? 输入 输入包含多组测试数据.每组输入一个正整数N(N<=1000000). 输出 对于每组输入,输出N^N的最左边的数字. 样例输 ...
- JavaScript八张思维导图—操作符
JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...
- Vue.js学习网址
Vue官网:http://cn.vuejs.org/v2/guide/index.html 淘宝镜像:http://npm.taobao.org/ Vue-router:https://router. ...
- 二叉搜索树的平衡--AVL树和树的旋转(图解)
二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...
- set&enum小结(database)
今天发现mysql中有set这种数据类型,工作的业务中也使用到了.网上查阅资料后,小结一下 先总结一下两者的分别 set和enum类似表单中的多选和单选,set和enum在数据库内部是用整数表示的,显 ...
- linux_Nginx日志
错误信息日志配置: 日志文件默认:/application/nginx/logs/erroe.log error_log logs/error.log error; # 不写默认就有,默认error, ...
- 解决service层无法注入
练手时发现个问题,路径404,各种检查发现,多加了一层<context:component-scan base-package="com.yanan.controller"/ ...