随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信。如下图所示:

  

一.对Socket Server的要求

  我们可以尝试让Socket Server透明地支持WebSocket客户端,所谓透明的意思是,服务端开发人员不用关心客户端究竟是什么类型,而是可以统一的接收数据、处理数据、发送数据。为了做到这一点,我们可以构建一个服务端框架,让框架完成透明化的工作,这就要求这个框架做到以下几点:

(1)根据客户端TCP连接请求成功后的第一个消息中是否含有“websocket”标记,来判断其是否为WebSocket客户端。如果客户端的类型是WebSocket,则自动完成以下事情。

(2)自动完成Web Sokects 握手协议。

(3)针对接收到的每个WebSokect数据帧,都能自动将其解析,并从中分离出真正的消息内容。

(4)当您发送消息给WebSokect客户端时,服务端引擎会自动将该消息封装成WebSokect数据帧,然后再发送出去。

  我们在StriveEngine中实现了对上述WebSocket的透明化支持,至于具体如何实现的,大家可以参考一下WebSokect的标准协议。下面我们就来做一个Demo,让.NET Socket客户端和WebSocket客户端能同时与一个StriveEngine服务端进行双向通信。

二.打通B/S与C/S的Demo 准备

  基于WebSokect,我们在绝大多数情况下,使用的都是文本消息,OK,那我们就基于文本消息来构建这个Demo。

(1)虽然WebSokect可以借助其HTML5协议来自动完成一个消息的独立识别,但是对于我们的普通socket来说,必须有一个方法来识别一个完整的消息。

(2)常用的方法是使用特殊的消息结束标识符,那在这个demo中,我们就以'\0'作为消息的结束符吧。

(3)基于(2),那么WebSokect在发送消息给服务端时,也必须在消息结尾加上'\0'。

三.Demo实现

  我们先看看Demo运行起来的效果:

  在Demo中,WebSocket客户端和.NET Socket客户端都可以与同一个服务端进行互通消息。

1.源码结构说明

  该Demo源码总共包括三个项目和一个HTML文件:

(1)StriveEngine.SimpleDemoServer:基于StriveEngine开发的服务端。

(2)StriveEngine.SimpleDemoClient:基于StriveEngine开发的客户端。

(3)StriveEngine.SimpleDemo:直接基于.NET的Socket开发的客户端。

(4)WebSocketClient.html:基于HTML5 WebSocket的客户端。与前两种客户端公用同一个StriveEngine服务端。

  接下来,我们着重看一下WebSocket客户端实现,其它的.NET代码,大家直接去看Demo源码就好了。

2.WebSocket客户端实现

(1)HTML 页面布局

<body><h3>WebSocketTest</h3><div id="login"><div><input id="serverIP" type="text" placeholder="服务器IP" value="127.0.0.1" autofocus="autofocus" /><input id="serverPort" type="text" placeholder="服务器端口" value="9000" /><input id="btnConnect" type="button" value="连接" οnclick="connect()" /></div><div><input id="sendText" type="text" placeholder="发送文本" value="I'm WebSocket Client!" /><input id="btnSend" type="button" value="发送" οnclick="send()" /></div><div><div>来自服务端的消息</div><textarea id="txtContent" cols="50" rows="10" readonly="readonly"></textarea></div></div>
</body>

(2)js方法实现

<script>var socket;function connect() {var host = "ws://" + $("serverIP").value + ":" + $("serverPort").value + "/"socket = new WebSocket(host);try {socket.onopen = function (msg) {$("btnConnect").disabled = true;alert("连接成功!");};socket.onmessage = function (msg) {if (typeof msg.data == "string") {displayContent(msg.data);}else {alert("非文本消息");}};socket.onclose = function (msg) { alert("socket closed!") };}catch (ex) {log(ex);}}function send() {var msg = $("sendText").value + '\0'socket.send(msg);}window.onbeforeunload = function () {try {socket.close();socket = null;}catch (ex) {}};function $(id) { return document.getElementById(id); }Date.prototype.Format = function (fmt) { //author: meizz var o = {"M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 };if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));for (var k in o)if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));return fmt;}function displayContent(msg) {$("txtContent").value += "\r\n" +new Date().Format("yyyy/MM/dd hh:mm:ss")+ ":  " + msg;}function onkey(event) { if (event.keyCode == 13) { send(); } }</script>

  js代码中的重点都通过红色字体标记出来了,要特别注意,send方法在发送消息时,会自动在消息的末尾添加一个我们约定好的结束符'\0'。

四.源码下载

  打通BS与CS的Demo源码

   如果有任何建议或问题,请留言给我。

 附相关系列:文本协议通信demo源码及说明文档

二进制协议通信demo源码及说明文档

另附:简单即时通讯Demo源码及说明

Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!相关推荐

  1. html5 websocket与c,打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

  2. 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们能够借助WebSocket来更加方便地打通BS与CS -- 由于B/S中的WebSocket能够直接连接到C/S的服务端,并进行双向通信.例 ...

  3. (一)android 桌面悬浮窗 录屏源码放送

    看到几个网友留言需要源码参考,需要的可以拿走: 这里先提供几个工具类: 1.录屏工具类ScreenUtil.java package com.android.systemui.util;import ...

  4. c语言炒股软件公式,20年的炒股实战公式让你认清股市本质 想不发财就难 源码放送 送给有缘人...

    好股票软件下载网(www.goodgupiao.com)提示:您正在下载的是:20年的炒股实战公式让你认清股市本质 想不发财就难 源码放送 送给有缘人 红线低位筹码密集 绿线高位筹码密集 白线在低位是 ...

  5. bootstrap项目实例_101个Python项目打包放送,工作学习必备(源码放送)

    了解Python的小伙伴都知道,Python是一个开源的编程语言,正是因为有全世界爱好Python的程序员不断完善Python编程语言,才有了现在Python这么强的实用性,能和各个语言结合使用,被称 ...

  6. Java语言实现简单FTP软件------源码放送(十三)

    Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...

  7. 人脸识别(三)——源码放送。opencv人脸识别

    人脸识别相关的基本原理和流程,以及各个步骤的介绍和代码前两篇(链接1:http://blog.csdn.net/weixin_40787712/article/details/79186740链接2: ...

  8. qq音乐sign算法还原源码放送及jsvmp全流程分析

    1.声明 本次分析过程仅限于学习使用,请勿用于非法用途,若读者用于非法用途其造成的一切后果与本人无关,若本文章侵犯了贵公司的权益请添加本人微信YotaGit联系删除 博客所写的所有算法还原均已开源在G ...

  9. boss直聘zp_stoken逆向分析源码放送

    1.前言 本分析过程仅供学习交流使用,,若读者将其用于非法用途,其造成的一切后果与本人无关 博客所写的所有算法还原均已开源在GitHub,地址 https://github.com/YotaGit/A ...

  10. 一文足矣——计算机视觉七十年历程+11份精悍源码放送

    计算机视觉是人工智能领域中的一个重要分支,它的发展经历了多个阶段.以下是计算机视觉发展的历程以及所有传统模型和近十年发展的介绍. 一.发展历程 (1)20世纪50年代到60年代 计算机视觉的起步阶段. ...

最新文章

  1. 选择列表中的列……无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
  2. java分装_Java ——Number Math 类 装箱 拆箱 代码块
  3. VMWare安装DOS系统实现文件共享
  4. ARM(IMX6U)裸机之I.MX6ULL硬件启动方式的选择
  5. 什么是公有云、私有云、混合云?
  6. (转) 淘淘商城系列——redis-desktop-manager的使用
  7. 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
  8. Java 8 新特性:3-函数(Function)接口
  9. 计算机财务应用实验心得,金蝶财务软件实训心得.doc
  10. 计算机辅助设计及工程分析的特点,EDA技术的简单介绍及特点分析
  11. c语言在内存存储结构,C语言中float,double类型,在内存中的结构(存储方式)
  12. redis存储关系性数据库数据
  13. 英语期末复习——大学英语词汇解析
  14. QEMU文档之虚拟NVDIMM
  15. 剑指spring源码(三)
  16. 推荐一款精美小众的读书笔记app
  17. NR 5G 入网流程
  18. 中移动TD-LTE及对终端的要求
  19. 什么是奇异值分解(SVD)?
  20. FPGA入门到实战-学习笔记

热门文章

  1. 脸部识别算法_面部识别技术是种族主义者吗? 先进算法的解释
  2. append追加的html中富文本失效,jquery append 动态添加的元素事件on 不起作用的解决方案...
  3. 报表服务器无法打开数据库连接 修改 web.config,修改服务器数据库连接配置
  4. python备份目录下文件夹_python---备份目录和文件
  5. 按群计数10以内_10米12米60吨地磅扬州地磅数字地磅厂-鹰衡称重
  6. 过椭圆外一点引两条切线方程_S16-2 二次曲线和圆方程
  7. python: 正则表达式2--元字符与re模块
  8. 3.Web中使用iReport 整合----------创建PDF格式的
  9. MYSQL 解压版5.7.12安装和客户端连接。
  10. Nodejs的各种数据库驱动地址汇总