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

关于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. 10个带源码的充满活力的Web设计教程

    10个带源码的充满活力的Web设计教程 2013-08-02 16:47 佚名 OSCHINA编译 我要评论(0) 字号:T | T Web设计师必须了解各种各样的Web设计风格,这才能让他或者她在设 ...

  2. 使用Pushlet来实现服务器端向客户端推送信息

        使用Pushlet来实现服务器端向客户端推送信息 1.   实现方式: 有两种实现方式: 1.         通过配置文件来实现定时的从服务器端向客户端推送信息 2.         通过A ...

  3. [Unity]C#中 将XML和实体类之间进行相互转换的工具类

    using System; using System.Xml; using System.Xml.Serialization; using System.IO; namespace LOTool { ...

  4. [iOS Animation]-CALayer 图层性能

    图层性能 要更快性能,也要做对正确的事情. ——Stephen R. Covey 在第14章『图像IO』讨论如何高效地载入和显示图像,通过视图来避免可能引起动画帧率下降的性能问题.在最后一章,我们将着 ...

  5. Mysql中Insert into xxx on duplicate key update问题

    要点:Insert into xxx on duplicate key update可以在唯一索引重复的情况下,进行更新操作.           (1) 插入里边的字段应该只有一个 唯一索引:   ...

  6. LPC2478的硬件IIC使用

    LPC2478的IIC使用 LPC2478带有三个IIC接口,每个IIC都可以工作在主机或者从机模式下,LPC的IIC的架构是一种状态机的形式,在不同的的时间做不同的工作之后有不同的状态来表示, 简单 ...

  7. 利用openURL,在IOS应用中打开另外一个应用

    在IOS中,实现一个应用启动另外一个应用,使用UIApplication的openURL:方法就可实现,这里以test跳到test02为例.(需要先创建这两个工程) 注册自定义URL协议(在test中 ...

  8. 【解决】System.Web.Http.Description 缺失

    一.问题描述 使用visual studio 2013创建mvc4 api模板,然后build,run,broken,出错如下: Error 1 The type or namespace name ...

  9. INSTALL_FAILED_UPDATE_INCOMPATIBLE

    安装apk的时候,报错. 解决:把所有这个apk的相关信息删除干净,隐藏较深的是设置->应用管理->这个应用的相关信息删除干净就可以了

  10. ecshop中ajax的调用原理 1

    ecshop中ajax的调用原理   1:首先ecshop是如何定义ajax对象的. ecshop中的ajax对象是在js/transport.js文件中定义的.里面是ajax对象文件.声明了一个va ...