概述

websocket目前虽然无法普及应用,未来是什么样子,我们不得而知,但现在开始学习应用它,只有好处没有坏处,本随笔的WebSocket是版本13(RFC6455)协议的实现,也是目前websocket的最新协议,协议的英文文档可以查看http://tools.ietf.org/html/rfc6455,中文翻译的文档可以查看http://blog.csdn.net/stoneson/article/details/8063802,下面是聊天的截图例子(很粗糙,但应该不影响)。

客户端的实现

在支持webSocket的浏览器下,调用 new window.WebSocket(url)就返回了websocket对象,此对象有onopen、onmessage、onclose三个常用事件,分别表示连接成功、收到消息、连接断开,发送消息(文件或二进制数据)的方法是send。

           var inc = document.getElementById('incomming');
var form = document.getElementById('sendForm');
var input = document.getElementById('sendText'); inc.innerHTML += "正在连接到服务器 ..<br/>";
var wsImpl = window.WebSocket || window.MozWebSocket;
var ws = new wsImpl('ws://localhost:8181/'); ws.onopen = function () {
inc.innerHTML += '连接成功<br/>';
}; ws.onmessage = function (evt) {
inc.innerHTML += evt.data + '<br/>';
}; ws.onclose = function () {
inc.innerHTML += '连接已断开<br/>';
} form.addEventListener('submit', function (e) {
e.preventDefault();
var val = input.value;
ws.send(val);
input.value = "";
});

服务器的实现

服务器使用NetworkSocket组件的WebSocketServerBase来实现,过程中只要关心业务的实现就可以了,底层的代码,如果你感兴趣,点击链接进去就可以下载和查看。}

    public class Server : WebSocketServerBase
{
/// <summary>
/// 收到文本请求时出发
/// </summary>
/// <param name="client">客户端</param>
/// <param name="text">内容</param>
protected override void OnText(SocketAsync<Hybi13Packet> client, string text)
{
// 回复内容
this.SendText(client, "->" + text); // 转发给其它客户端
var others = this.AliveClients.Except(new[] { client });
foreach (var item in others)
{
this.SendText(item, client.ToString() + "->" + text);
} // ping此客户端,记录ping的时间
client.TagBag.PingTime = DateTime.Now;
this.SendPing(client, null);
} protected override void OnBinary(SocketAsync<Hybi13Packet> client, byte[] bytes)
{
this.SendBinary(client, bytes);
} // ping回复
protected override void OnPong(SocketAsync<Hybi13Packet> client, byte[] bytes)
{
var timeSpan = DateTime.Now.Subtract((DateTime)client.TagBag.PingTime);
Console.WriteLine("ping {0} 用时:{1}ms", client, timeSpan.TotalMilliseconds);
} protected override bool CheckHandshake(SocketAsync<Hybi13Packet> client, HandshakeRequest request)
{
Console.WriteLine("{0}进行握手完成", client);
return base.CheckHandshake(client, request);
} protected override void OnConnect(SocketAsync<Hybi13Packet> client)
{
Console.WriteLine("客户连接进来,当前连接数:{0}", this.AliveClients.Count);
} protected override void OnDisconnect(SocketAsync<Hybi13Packet> client)
{
Console.WriteLine("{0}断开连接,当前连接数:{1}", client, this.AliveClients.Count);
}
}

下载源码

所有相关代码

webSocket实现web及时聊天的例子的更多相关文章

  1. WEB实时聊天 comet推技术

    转自:http://www.cnblogs.com/wodemeng/archive/2012/04/06/2435302.html 今天晚上朋友遇到web服务端推技术的问题,自己就查了下资料,学习了 ...

  2. 基于Nodejs开发的web即时聊天工具

    由于公司需要开发web即时聊天的功能,开始时我们主要的实施方法是用jquery的ajax定时(10秒)轮询向服务器请求,由于是轮询请求,对 服务器的压力比较大.我们网站上线的时间不长,访问量不是很大, ...

  3. WebSocket实现web即时通信(后端nodejs实现)

    WebSocket实现web即时通信 一.首先看一下,HTTP.ajax轮询.long poll和WebSocket的区别: 1.HTTP 协议(短连接):一个 Request 一个 Response ...

  4. Node.js+websocket+mongodb实现即时聊天室

    ChatRoom Node.js+websocket+mongodb实现即时聊天室 A,nodejs简介:Node.js是一个可以让javascript运行在服务器端的平台,它可以让javascrip ...

  5. Python面试-websocket及web框架

    一.Websocket 1. websocket概念 在讲websocket之前,我们先来看看ajax轮询和long poll的实现机制. A.  ajax轮询 ajax轮询的原理非常简单,让浏览器隔 ...

  6. HTML5新特性 websocket(重点)--多对多聊天室

    一.html5新特性  websocket(重点)--多对多聊天室 HTTP:超文本传输协议 HTTP作用:传输网页中资源(html;css;js;image;video;..) HTTP是浏览器搬运 ...

  7. 如何利用WebSocket实现网页版聊天室

    花了将近一周的时间终于完成了利用WebSocket完成网页版聊天室这个小demo,期间还走过了一段"看似弯曲"的道路,但是我想其实也不算是弯路吧,因为你走过的路必将留下你的足迹.这 ...

  8. 【WebSocket No.2】WebSocket和Socket实现聊天群发

    介绍: 前面写过一篇简单的websocke实现服务端.这一篇就不在说什么基础的东西主要是来用实例说话,主要是讲一下实现单聊和群组聊天和所有群发的思路设计. 直接不懂的可以看一下上一篇简单版本再来看也行 ...

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

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

随机推荐

  1. GridControl控件的数据显示的样式控制(转)

    如上两图所示,Dev列表控件GridControl默认的格式并没有渐变变色效果,显示的日期数据,也是“yyyy-MM-dd”的格式,而非“yyyy-MM-dd HH:mm:ss”即使对于后面有长格式的 ...

  2. Linux 环境变量的配置

    一. 环境变量相关的几个配置文件(针对bash): 1.  /etc/profile 系统环境变量配置文件:针对整个系统的所有用户生效,系统启动后用户第一次登陆时,此文件被执行,并从/etc/prof ...

  3. .NET(C#)中不同级别的安全透明代码对类型的影响

    测试代码将测试一个方法和类默认在全部信任权限下和部分信任权限下的代码类型. 上面说的默认就是指未加入其他安全透明类型的特性. 代码类型可以是: 透明代码(Transparent Code) 关键代码( ...

  4. Centos 部署Keepalive高可用软件

    Keepalive安装部署   一.环境介绍 1)Centos6.4 2) keepalived-1.2.12 3) 主备机的ip Master:172.31.100.5 Slave: 172.31. ...

  5. Apache Drill Install and Test

    Drill doc, https://drill.apache.org/docs/hive-storage-plugin/ 发现在国内访问的时候有些标签反应还是很慢,因为它访问了gooleapi的缘故 ...

  6. Storm calculate pv

    本题其实就是storm的wordcout,需要把一个gz压缩的文件读取,并使用storm计算其pv. 样本 数据: 存储为accesslog.gz 我把它加载到我的虚拟机中/mnt/下. 没有使用tr ...

  7. listview中OnItemClick方法各个参数的作用

    OnItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 1.arg0,arg2 m_listview.setOnI ...

  8. LeetCode 2 Add Two Sum 解题报告

    LeetCode 2 Add Two Sum 解题报告 LeetCode第二题 Add Two Sum 首先我们看题目要求: You are given two linked lists repres ...

  9. Codeforces Round 261 Div.2 E Pashmak and Graph --DAG上的DP

    题意:n个点,m条边,每条边有一个权值,找一条边数最多的边权严格递增的路径,输出路径长度. 解法:先将边权从小到大排序,然后从大到小遍历,dp[u]表示从u出发能够构成的严格递增路径的最大长度. dp ...

  10. 给定一个整数实现奇偶bit位互换

    1.分别取出所有奇数bit位和偶数bit位 0x55555555(对应二进制奇数bit位为1,偶数bit位全为0)&num 0xaaaaaaaa(对应二进制即偶数bit位为1,奇数bit位全为 ...