Superwebsocket 模拟微信聊天室
在园子里潜水几年了,工作以来算是有些积累,突然想写点东西方便以后温故而知新,希望自己能够坚持下去。
关于Superwebsocket的介绍我就不多说了,请点击:http://www.cnblogs.com/shanyou/archive/2012/07/21/2602269.html
说下Superwebsocket几个常用的侦听事件:
NewSessionConnected:有新会话握手并连接成功时触发
SessionClosed:有会话被关闭 可能是服务端关闭 也可能是客户端关闭时触发
ws_NewMessageReceived:有客户端发送新的消息时触发
客户端的实现代码:
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<script type="text/javascript">
var url = "ws://192.168.1.114:75";//连接到服务器IP和端口
var ws = null;
function onLogin() {
var name = document.getElementById('txt_name');
var content = document.getElementsByTagName('ul')[0];
if(name.value == '') {
alert("请先输入用户名");
return;
}
var name1= document.getElementById('txt_name').value + "/" + returnCitySN["cip"] + "/" + returnCitySN["cname"];
var fullUrl = url + "/" + name1; if ("WebSocket" in window) {
ws = new WebSocket(fullUrl);
}
else if ("MozWebSocket" in window) {
ws = new MozWebSocket(fullUrl);
} else {
content.innerHTML += '<li style="text-align: center;"><span>浏览器不支持WebSocket</span></li>';
} ws.onopen = function () {
content.innerHTML += '<li style="text-align: center;"><span>连接服务器成功</span></li>';
changeElementEnabled(true);
}
ws.onclose = function () {
content.innerHTML += '<li style="text-align: center;"><span>与服务器断开连接</span></li>';
changeElementEnabled(false);
} ws.onerror = function () {
content.innerHTML += '<li style="text-align: center;"><span>通信发生错误</span></li>';
} ws.onmessage = function (msg) {
if (num == 0) {
content.innerHTML += '<li><img src="Img/mz1.png" class="imgright"/><span class="spanright">' + msg.data + '</span></li>';
} else {
content.innerHTML += '<li><img src="Img/mz2.png" class="imgleft"/><span class="spanleft">' + msg.data + '</span></li>';
}
num = 0;
} } var num = 0;
function sendMessage() { //发送消息
//alert("send");
num = 1;
var msg = document.getElementById("text").value;
if (ws) {
ws.send(msg);
}
//content.scrollTop = content.scrollHeight;这一句不知道为什么不能让滚动条保持最下面,知道的请告知一下
}
</script>
服务端代码:
private const string ip = "192.168.1.114";
private const int port = ;
private WebSocketServer ws = null;//SuperWebSocket中的WebSocketServer对象
private Dictionary<string, WebSocketSession> dicSession = new Dictionary<string, WebSocketSession>();
delegate void SetTextCallBack(string text);
public string msg = ""; public Server()
{
InitializeComponent(); ws = new WebSocketServer();//实例化WebSocketServer //添加事件侦听
ws.NewSessionConnected += ws_NewSessionConnected;//有新会话握手并连接成功
ws.SessionClosed += ws_SessionClosed;//有会话被关闭 可能是服务端关闭 也可能是客户端关闭
ws.NewMessageReceived += ws_NewMessageReceived;//有客户端发送新的消息
} void ws_NewSessionConnected(WebSocketSession session)
{
msg = Environment.NewLine + DateTime.Now + " " + GetSessionName(session).Split('/')[]+"登录到服务器";
SendToAll(session, msg); if (!dicSession.ContainsKey(GetSessionName(session)))
{
dicSession.Add(GetSessionName(session).Split('/')[], session);
}
LoadData();
} void ws_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
{
msg = Environment.NewLine + string.Format("{0:HH:MM:ss} {1} 离开聊天室", DateTime.Now, GetSessionName (session).Split('/')[]);
SendToAll(session, msg); if (dicSession.ContainsKey(GetSessionName(session)))
{
dicSession.Remove(GetSessionName(session).Split('/')[]);
}
LoadData();
}
void ws_NewMessageReceived(WebSocketSession session, string value)
{
var msg = string.Format("{0:HH:MM:ss} {1}说: {2}", DateTime.Now, GetSessionName(session).Split('/')[], value); SendToAll(session, msg); } public void Start()
{
if (!ws.Setup(ip, port))
{
textBox1.Text += "ChatWebSocket 设置WebSocket服务侦听地址失败" + "\n";
return;
} if (!ws.Start())
{
textBox1.Text += "ChatWebSocket 启动WebSocket服务侦听失败" + "\n";
return;
}
textBox1.Text += "ChatWebSocket 启动服务成功" + "\n";
} /// <summary>
/// 停止侦听服务
/// </summary>
public void Stop()
{ if (ws != null)
{
ws.Stop();
}
} private string GetSessionName(WebSocketSession session)
{
//这里用Path来取Name 不太科学……
return HttpUtility.UrlDecode(session.Path.TrimStart('/'));
}
private void SendToAll(WebSocketSession session, string msg)
{
//广播
foreach (var sendSession in session.AppServer.GetAllSessions())
{
sendSession.Send(msg);
}
} //发送数据
private void btnSend_Click(object sender, EventArgs e)
{
try
{
if (dataGridView1.CurrentRow == null) return;
var name = dataGridView1.CurrentRow.Cells["用户"].Value.ToString();
if (dicSession.ContainsKey(name))
{
dicSession[name].Send("管理员对你说:" + textBox2.Text);
LoadData();
}
MessageBox.Show("发送成功");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} } //断开某个客户机
private void btnClose_Click(object sender, EventArgs e)
{
try
{
if (dataGridView1.CurrentRow == null) return;
var name = dataGridView1.CurrentRow.Cells["用户"].Value.ToString();
if (dicSession.ContainsKey(name))
{
dicSession[name].Close(SuperSocket.SocketBase.CloseReason.Unknown);
dicSession.Remove(name);
LoadData();
MessageBox.Show(name + "已经被剔除服务器");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} } //对所有聊天室用户进行广播
private void button4_Click(object sender, EventArgs e)
{
try
{
if (dataGridView1.CurrentRow == null) return;
var name = dataGridView1.CurrentRow.Cells["用户"].Value.ToString();
if (dicSession.ContainsKey(name))
{
#region 这里测试局域网的连接如果发送数量过大可能会导致局域网很卡
//for (int i = 1; i < 10000; i++)
//{
// SendToAll(dicSession[name], "广播:" +"NO:"+i+ textBox2.Text);
//}
#endregion
SendToAll(dicSession[name], "广播:"+ textBox2.Text);
}
MessageBox.Show("广播成功");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
最后效果图如下:



在局域网测试50000连接可以正常使用,外网暂时还未测试。
Superwebsocket 模拟微信聊天室的更多相关文章
- python模拟QQ聊天室(tcp加多线程)
python模拟QQ聊天室(tcp加多线程) 服务器代码: from socket import * from threading import * s = socket(AF_INET,SOCK_S ...
- 基于Websocket开发的仿微信聊天室
一.运行环境及涉及技术:----------------------------------* Visual Studio 2019* SQL SERVER 2008 R2* .Net FrameWo ...
- h5聊天室web端(仿微博、微信)|h5仿微信网页端|仿微信界面弹窗
这段时间一直在着手h5开发手机端聊天系统——html5仿微信聊天室,最近又在原先基础上开发了一个仿微信.微博网页web版聊天系统,使用到了HTML5+css3+jQuery+wcpop等技术开发,弹窗 ...
- uni-app聊天室|vue+uniapp仿微信聊天实例|uniapp仿微信App界面
一.介绍 运用UniApp+Vue+Vuex+swiper+uniPop等技术开发的仿微信原生App聊天室|仿微信聊天界面实例项目uniapp-chatroom,实现了发送图文消息.表情(gif图), ...
- 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序
对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...
- HTML5仿手机微信聊天界面
HTML5仿手机微信聊天界面 这篇文章主要为大家详细介绍了HTML5仿手机微信聊天界面的关键代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 给大家带来的是HTML5仿手机微信聊天界面, ...
- 利用scrollintoview方法模拟聊天室收到新消息
这段时间再写一个聊天的功能,基本的原理已经通了,剩下的就是细化功能和实现了.原理通了不代表就能解决了这个问题,今天就遇到了一个小问题,就是在接收到新的消息以后,最新的消息不能显示在消息区域,而是跑到了 ...
- vue仿微信网页版|vue+web端聊天室|仿微信客户端vue版
一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室— ...
- vue聊天室|h5+vue仿微信聊天界面|vue仿微信
一.项目简介 基于Vue2.0+Vuex+vue-router+webpack2.0+es6+vuePhotoPreview+wcPop等技术架构开发的仿微信界面聊天室——vueChatRoom,实现 ...
随机推荐
- 利用 gperftools 对nginx mysql 内存管理 性能优化
利用 gperftools 对nginx 与 mysql 进行 内存管理 性能优化 降低负载. Gperftools 是由谷歌开发.官方对gperftools 的介绍为: These tools ...
- location下的属性集锦
location.protocol="http:"//即,协议 location.hostname="zhidao.baidu.com"//即,主机域名
- Cookie mapping技术
摘要: RTB竞价中的cookie mapping技术解决DSP的cookie跟ad change的cookie匹配问题. Cookie mapping分为两步:(1)google ad exchan ...
- SpringMVC和mybatis的框架
1.首先以一个项目做例子,该项目用到的框架即为SpringMVC+mybatis,项目环境为MyEclipse+sqlserver+tomcat6,项目的地址(项目+数据库备份文件)大家可以上我的百度 ...
- MyBatis 3 中使用存储过程
转:http://zachary-guo.iteye.com/blog/1756689 Mybats 是 iBatis 被 Google 收购后重新命名的一个工程,当然也做了大量的升级.iBatis ...
- java 自动备份MySQL 数据库(转载)
1 package com.learn4j.bat; public class Backup { private String user_name;// 数据库用户名 private String u ...
- Ubuntu下搭建C++开发环境
Ubuntu使用eclipse搭建c/c++编译环境----CDT插件 Ubuntu(Linux)使用Eclipse搭建C/C++编译环境 这两天,给自己电脑弄了双系统,除了原来的W ...
- 《算法导论》习题2.3-7 查找集合S中是否有两个元素和为X---Java实现
代码如下: public class MergeSort { public static void sort(int [] A,int p, int r) { if(p<r) { int q = ...
- iOS开发之指纹解锁
http://blog.csdn.net/hongfengkt/article/details/49868073 前一阵子一直在赶项目进度,没有太多时间写博客,现在终于空闲了,将以前欠下的博客补上来. ...
- C++中string类的使用方法
如果所比较的两个string 相等,则返回0: 操作string 大于参数string,返回 正数:操作string 小于参数string,返回负数. (1) 比较操作string 与 _Str 或C ...