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,实现 ...
随机推荐
- DateTime.CompareTo方法
DateTime.CompareTo(value)方法,与一个时间比较,返回整数,含义如下: 值 说明 小于零 此实例早于 value. 零 此实例与 value 相同. 大于零 此实例晚于 valu ...
- css 弹出框
最近想弄一个类似登陆框的那种弹出框,其实网上已经有很多例子,而且也有相应的插件,例如:jquery-ui的,可直接使用,而我就简单的弄了个简易版的登陆框,真的很简易. 其实原理就是设置两个div,一个 ...
- (中等) UESTC 94 Bracket Sequence,线段树+括号。
There is a sequence of brackets, which supports two kinds of operations. we can choose a interval [l ...
- phpMyAdmin安装与配置(涉及LAMP配置)
作者:zccst 安装一个phpMyAdmin还真麻烦,遇到很多问题.不过在解决过程中发现,PHP的水还真深,不是短时间可以看透的. 1,下载 建议去百度软件中心下载 2,使用 (1)解压后,复制配置 ...
- TimeDelta.total_seconds() in Python2.6-
Python 的日期操作真是无力吐槽. 如果在做日期相加减时使用TimeDelta对象,2.7及以后的TimeDelta有total_seconds()方法获取总秒数,而2.6之前没有该方法,且众所周 ...
- iOS开发——缩放图片
捏合图片,在原imageView中放大缩小图片. 懒得多说,直接上代码: // // ViewController.m // Demo-hehehe // // Created by yyt o ...
- Java层与Jni层的数组传递(转)
源:Java层与Jni层的数组传递 Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的S ...
- android NDK编译(导入).a文件和编译多个so文件(转)
源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include ...
- 一些JSON 教程
JSON 以下内容来自W3school. JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. ...
- 初学杂文 String类
String: 两个字符床 String stra 和String strb stra = "hello " ; strb = "hello " 在对象池中开 ...