在园子里潜水几年了,工作以来算是有些积累,突然想写点东西方便以后温故而知新,希望自己能够坚持下去。

关于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 模拟微信聊天室的更多相关文章

  1. python模拟QQ聊天室(tcp加多线程)

    python模拟QQ聊天室(tcp加多线程) 服务器代码: from socket import * from threading import * s = socket(AF_INET,SOCK_S ...

  2. 基于Websocket开发的仿微信聊天室

    一.运行环境及涉及技术:----------------------------------* Visual Studio 2019* SQL SERVER 2008 R2* .Net FrameWo ...

  3. h5聊天室web端(仿微博、微信)|h5仿微信网页端|仿微信界面弹窗

    这段时间一直在着手h5开发手机端聊天系统——html5仿微信聊天室,最近又在原先基础上开发了一个仿微信.微博网页web版聊天系统,使用到了HTML5+css3+jQuery+wcpop等技术开发,弹窗 ...

  4. uni-app聊天室|vue+uniapp仿微信聊天实例|uniapp仿微信App界面

    一.介绍 运用UniApp+Vue+Vuex+swiper+uniPop等技术开发的仿微信原生App聊天室|仿微信聊天界面实例项目uniapp-chatroom,实现了发送图文消息.表情(gif图), ...

  5. 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序

    对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...

  6. HTML5仿手机微信聊天界面

    HTML5仿手机微信聊天界面 这篇文章主要为大家详细介绍了HTML5仿手机微信聊天界面的关键代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下     给大家带来的是HTML5仿手机微信聊天界面, ...

  7. 利用scrollintoview方法模拟聊天室收到新消息

    这段时间再写一个聊天的功能,基本的原理已经通了,剩下的就是细化功能和实现了.原理通了不代表就能解决了这个问题,今天就遇到了一个小问题,就是在接收到新的消息以后,最新的消息不能显示在消息区域,而是跑到了 ...

  8. vue仿微信网页版|vue+web端聊天室|仿微信客户端vue版

    一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室— ...

  9. vue聊天室|h5+vue仿微信聊天界面|vue仿微信

    一.项目简介 基于Vue2.0+Vuex+vue-router+webpack2.0+es6+vuePhotoPreview+wcPop等技术架构开发的仿微信界面聊天室——vueChatRoom,实现 ...

随机推荐

  1. sublime C++ build system配置体验

    近期准备实习,于是终于步入了sublime的阵营,sublime确实性感. 在配置win7下C++编译运行集成环境的时候遇到点问题,于是接触了一下JSON格式,最后终于自己搞定了.. 参考文档:htt ...

  2. phpcms v9 后台首页 去掉团队信息等版权

    phpcms\languages\zh-cn\admin.lang.php $LANG['main_product_team'] = 'PHPCMS开发团队'; phpcms\modules\admi ...

  3. Spring自学教程-声明式事务处理(六)

    Spring事务处理分两种: 一.编程式事务:在程序中控制事务开始,执行和提交: 1.1 使用TransactionTemplate, 使用回调函数执行事务,不需要显示开始事务,不需要显示提交事务,但 ...

  4. CodeForces 626B Cards

    瞎搞题...凭直觉+猜测写了一发,居然AC了.. #include<cstdio> #include<cstring> #include<cmath> #inclu ...

  5. 用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)(转)

    源:用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台) 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细. /*********************** ...

  6. java.lang.UnsupportedClassVersionError: com/T : Unsupported major.minor version问题解决

    编译的时候jdk版本为1.8 2.运行的时候jdk版本为1.7 解决办法:将编译的jdk版本降为1.7,问题解决

  7. 【spoj8222】 Substrings

    http://www.spoj.com/problems/NSUBSTR/ (题目链接) 题意 给出一个字符串S,令${F(x)}$表示S的所有长度为x的子串出现次数的最大值.求${F(1)..... ...

  8. IOS开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

  9. HDU 1813 Escape from Tetris

    TMDTMD IDA*没跑了.什么是IDA*? 就是迭代深搜+A*估个价. 然而为什么调了一天? n<=2的时候我输出了东西.... 看了一天. #include<iostream> ...

  10. Oracle数据库中的函数

    1.随机数函数:DBMS_RANDOM.RANDOM )) FROM DUAL; --产生一个100以内的随机数 *dbms_random.value) FROM dual; --产生一个100-10 ...