C# Websocket服务器:永远不会调用web套接字上的onopen函数

C# Websocket服务器:永远不会调用web套接字上的onopen函数,c#,websocket,C#,Websocket,我试图实现一个C#web套接字服务器,但它给我带来了一些麻烦。 我正在运行一个web服务器(ASP.NET)来承载带有javascript的页面,web套接字服务器被实现为一个C#console应用程序 我能够检测来自客户端的连接尝试(运行javascript的chrome),也能够从客户端检索握手。但是客户端似乎不接受我发回的握手(web套接字上的onopen函数从未被调用) 我一直在看报纸,看不出我做错了什么。 下面是一段服务器代码: Socket listener = new Socket

我试图实现一个C#web套接字服务器,但它给我带来了一些麻烦。 我正在运行一个web服务器(ASP.NET)来承载带有javascript的页面,web套接字服务器被实现为一个C#console应用程序

我能够检测来自客户端的连接尝试(运行javascript的chrome),也能够从客户端检索握手。但是客户端似乎不接受我发回的握手(web套接字上的
onopen
函数从未被调用)

我一直在看报纸,看不出我做错了什么。 下面是一段服务器代码:

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#server,因为chrome正在发送它应该发送的信息,但正如所说的,
onopen
函数从未被调用

所以我的问题简而言之: 你们中有人完成过这个任务吗?如果有,你是怎么做到的?
原因:您是否在代码中看到任何明显的错误(希望不要问太多)

可能是编码问题。这是我写的一个正在工作的C#服务器:

class Program
{
    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Loopback, 8181);
        listener.Start();
        using (var client = listener.AcceptTcpClient())
        using (var stream = client.GetStream())
        using (var reader = new StreamReader(stream))
        using (var writer = new StreamWriter(stream))
        {
            writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
            writer.WriteLine("Upgrade: WebSocket");
            writer.WriteLine("Connection: Upgrade");
            writer.WriteLine("WebSocket-Origin: http://localhost:8080");
            writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
            writer.WriteLine("");
        }
        listener.Stop();
    }
}
而相应的客户端托管在
localhost:8080


var socket=newwebsocket('ws://localhost:8181/websession');
socket.onopen=函数(){
警报('握手成功建立。现在可能发送数据…');
};
socket.onclose=函数(){
警报(“连接关闭”);
};

本例仅建立握手。建立握手后,您需要调整服务器以继续接受数据。

请使用UTF8编码发送文本消息

有一个开源websocket服务器,由C#实现,您可以直接使用它

这是我的开源项目

NET Framework 4.5引入了对Windows中WebSocket的支持 通信基础。WebSockets是一种基于标准的高效解决方案 支持通过标准网络进行双向通信的技术 HTTP端口80和443。标准HTTP端口的使用允许 WebSocket通过中介在web上进行通信。两个 添加了新的标准绑定以支持通过 网袋运输。NetHttpBinding和NetHttpsBinding。 可以在上配置特定于WebSocket的设置 HttpTransportBinding元素,通过访问WebSocketSettings 财产

我认为它仍然使用肥皂


谢谢!原来是握手中的WebSocket定位部分给了我麻烦。显然,它不能只是“ws://localhost:8181”。在将其更改为“ws://localhost:8181/something”并将javascript中的主机更改为相同的内容后,它成功了。感谢您的帖子。我尝试使用Chrome+静态html文件进行此操作,并且必须更改源代码以防止浏览器立即断开:writer.WriteLine(“WebSocket源代码:file://”)@Darin你的代码运行得很好。当我像往常一样删除那个“using”并声明那个“writer”时,它就不起作用了。问题是作者没有给客户回信。“你能解释一下吗?”达林我找到了我问题的答案。答案是“writer.Flush()”,现在,SuperWebSocket还包含一个WebSocket客户端实现!您可能希望使用NuGet上提供的Fleck: