首先本人有一个tcp服务器(SocketAsyncEventArgs)这种 已经封装好的类库.
代码大致如下.
代码大致如下.
Server server; server = new Server(textBox1.Text, int.Parse(textBox2.Text), 20, 1024 * 10); server.Connection = new BeginConnection(Con); server.Receive = new BeginReceive(Rec); server.Close = new BeginClose(Clo); server.Start();
实现也比较简单
bool Con(SocketAsyncEventArgs ar){} void Rec(byte[] data, SocketAsyncEventArgs ar){} void Clo(SocketAsyncEventArgs ar){}
所以的操作 都在Rec方法里完成,实现了跟设备通讯之类的 都正常完成.(单纯的tcp/ip协议).
现在要做微信(浏览器)控制,那么假如要保证效率的情况下本人觉得要用websocket来实现.
那么问题来了…websocket能否能连接到本人单纯的tcp/ip服务器?
当然了答案是确定的..原因是据说websocket只是一种协议.在数据传输的过程中..只是增加了一些”其他数据”而已.
相似这种..(以下代码为open接收到的数据)
GET / HTTP/1.1 Host: 192.168.1.119:9999 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Origin: file:// Sec-WebSocket-Version: 13 User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Sec-WebSocket-Key: gcAHi8ioJkgbf4JwtodynQ== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
但是这个时候 客户端(js)的onopen事件并没有执行..原因是这个握手也需要本人服务端做应答..
于是在网上找了个代码 输出一大堆字符串 转成byte[] 发送出去
代码如下.
public Byte[] ProduceResponse(string request) { String webSocketKey = Common.GetRegexValue(request, WebSocketKeyPattern)[0].Groups["key"].Value; String acceptKey = produceAcceptKey(webSocketKey); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(String.Concat("HTTP/1.1 101 Web Socket Protocol Handshake", Environment.NewLine)); stringBuilder.Append(String.Concat("Upgrade: WebSocket", Environment.NewLine)); stringBuilder.Append(String.Concat("Connection: Upgrade", Environment.NewLine)); stringBuilder.Append(String.Concat("Sec-WebSocket-Accept: ", acceptKey, Environment.NewLine, Environment.NewLine)); String asd = stringBuilder.ToString(); return Encoding.UTF8.GetBytes(stringBuilder.ToString()); }
但是这只是仅仅第一步”握手”成功了..那么接下来 本人就不知道怎么样下手了.
例如 js 发送给服务端数据 服务端接收 需要怎么样解析? 解析后能否需要应答?
服务端发送给js数据 能否也一样 需要先”解析”然后在发送?
原因是本人实在没精力去仔细研究websocket的协议体,,所以不知道论坛的人能否做过相似的功能..已经封装完了的类库.
例如 本人的”接收方法”就只有byte[] 参数 .通过这个byte[] 判断这是js还是 tcpclient
假如是js 那么 是open 还是send.
另外 最好还要有一个给js的send的方法的协议转换….
解决方案
11
不懂帮顶,等高手解答
111
SocketAsyncEventArgs你都会用了这个应该没什么问题,websocket也只是封装了一下TCP协议 ,和HTTP协议属于同一个级别的都是应用层,具体方法和SAEA非常相似。具体参考MSDN吧
11
封神,看signalR能不能解决你的问题
11
泻药
但是通信只懂皮毛,没深入研究过
再见……
但是通信只懂皮毛,没深入研究过
再见……
77
假如需要兼容已经存在的TCP服务,握手/接收/发送 都需要一个前置的抽象处理,这个处理就是实现websocket协议。
77
握手完了以后,就是全双工了,能否应答看需求。
数据的收发都需要以frame的方式处理(需要编码与解码操作),fastCSharp的HTTP服务有webSocket的实现,不过是集成模式而且代码已经深度优化不适合做参考,要读代码还不是去读协议。
本人的TCP兼容HTTP的处理是看前四个字节能否‘GET ’,然后分别交给不同的类型处理。
本人觉得题主应该去找websocket协议相关的资料,原因是实现可以是很简单的。
数据的收发都需要以frame的方式处理(需要编码与解码操作),fastCSharp的HTTP服务有webSocket的实现,不过是集成模式而且代码已经深度优化不适合做参考,要读代码还不是去读协议。
本人的TCP兼容HTTP的处理是看前四个字节能否‘GET ’,然后分别交给不同的类型处理。
本人觉得题主应该去找websocket协议相关的资料,原因是实现可以是很简单的。
1
可以使用 Fleck 来迅速开发一个 WebSocket 服务,只要写几行 c# 代码而已。
除了服务接入层的几行代码用 WebSocket,对指令的解析、处理都可以复用原来的自定义 TCP 服务代码。
除了服务接入层的几行代码用 WebSocket,对指令的解析、处理都可以复用原来的自定义 TCP 服务代码。