tcp服务器怎么样兼容websocket的客户端

.Net技术 码拜 8年前 (2016-05-08) 2019次浏览
首先本人有一个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协议相关的资料,原因是实现可以是很简单的。

1

可以使用 Fleck 来迅速开发一个 WebSocket 服务,只要写几行 c# 代码而已。
除了服务接入层的几行代码用 WebSocket,对指令的解析、处理都可以复用原来的自定义 TCP 服务代码。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明tcp服务器怎么样兼容websocket的客户端
喜欢 (0)
[1034331897@qq.com]
分享 (0)