我正在尝试实现一个 C# Web 套接字服务器,但它给我带来了一些麻烦。我正在运行一个 Web 服务器(ASP.NET)来使用 javascript 托管页面,并且 Web 套接字服务器被实现为 C# 控制台应用程序。
我能够检测到来自客户端的连接尝试(运行 javascript 的 chrome),还能够从客户端检索握手。但是客户端似乎不接受我发回的握手(onopen
永远不会调用网络套接字上的函数)。
我一直在阅读Web Socket 协议,但我看不出我做错了什么。下面是一些服务器代码:
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8181);
listener.Bind(ep);
listener.Listen(100);
Console.WriteLine("Wainting for connection...");
Socket socketForClient = listener.Accept();
if (socketForClient.Connected)
{
Console.WriteLine("Client connected");
NetworkStream networkStream = new NetworkStream(socketForClient);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);
//read handshake from client:
Console.WriteLine("HANDSHAKING...");
char[] shake = new char[255];
streamReader.Read(shake, 0, 255);
string handshake =
"HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
"Upgrade: WebSocket\r\n" +
"Connection: Upgrade\r\n" +
"WebSocket-Origin: http://localhost:8080\r\n" +
"WebSocket-Location: ws://localhost:8181\r\n" +
"\r\n";
streamWriter.Write(handshake);
streamWriter.Flush();
我在我的本地主机上运行端口 8080 上的 Web 服务器和端口 8181 上的 Web 套接字服务器。
我试过用不同的编码(ASCII、字节和十六进制)发送握手,但这似乎没有什么区别。连接永远不会完全建立。javascript看起来像这样:
var ws;
var host = 'ws://localhost:8181';
debug("Connecting to " + host + " ...");
try {
ws = new WebSocket(host);
} catch (err) {
debug(err, 'error');
}
ws.onopen = function () {
debug("connected...", 'success');
};
ws.onclose = function () {
debug("Socket closed!", 'error');
};
ws.onmessage = function (evt) {
debug('response: ' + evt, 'response');
};
我猜测错误在于 C# 服务器,因为 chrome 正在按应有的方式发送信息,但正如所说的那样,该onopen
函数永远不会被调用。
简而言之,我的问题是: 你们中的任何人有没有做到这一点——如果有,你是怎么做到的?原因是:您是否在代码中看到任何明显的错误(希望不要问太多)