Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接到套接字时出现错误“;WebSocket打开握手超时”;使用Javascript和C#_Javascript_C#_Html_Sockets_Websocket - Fatal编程技术网

连接到套接字时出现错误“;WebSocket打开握手超时”;使用Javascript和C#

连接到套接字时出现错误“;WebSocket打开握手超时”;使用Javascript和C#,javascript,c#,html,sockets,websocket,Javascript,C#,Html,Sockets,Websocket,大约4个小时的研究…开始吧 我有一个C#程序,可以发送和侦听特定套接字中的任何内容。通过使用这些插座,C#可以向它发送信息,也可以很好地接收信息。现在,转到我的JavaScript文件,我使用WebSocket接口与C#通信,但不起作用(通常在几分钟后超时)。当套接字联机时,JavaScript代码将花费大约4分钟的时间,然后抛出一个错误,称为“WebSocket打开握手超时”。我知道它可以找到,因为当ip端口不存在时,JavaScript文件会在接下来的几秒钟内抛出一个错误 我做过的事情: 关

大约4个小时的研究…开始吧

我有一个C#程序,可以发送和侦听特定套接字中的任何内容。通过使用这些插座,C#可以向它发送信息,也可以很好地接收信息。现在,转到我的JavaScript文件,我使用WebSocket接口与C#通信,但不起作用(通常在几分钟后超时)。当套接字联机时,JavaScript代码将花费大约4分钟的时间,然后抛出一个错误,称为“WebSocket打开握手超时”。我知道它可以找到,因为当ip端口不存在时,JavaScript文件会在接下来的几秒钟内抛出一个错误

我做过的事情:

关闭所有防火墙,在ip和端口的开头使用ws和wss(例如:wss://xxx.xxx.x.xx:11111),更改端口,将ip更改为仍可访问的有效ip,研究4小时

C#:

ip是本地的

长话短说,C#可以与自身通信,JavaScript可以找到它,但无法与之通信。

正确地完成握手。(或使用具有此功能的库/连接类型。)

WebSocket协议(如中最初定义)不会打开普通的无限制套接字,部分原因是出于安全原因

由于握手未完成,客户端WS请求将超时,因为从未收到HTTP“升级”响应。在握手完成之前,WS将不会在底层TCP连接上处于活动状态

启动WebSocket连接(“握手”)在RFC的中定义。本文还讨论了这一点

客户端通过称为WebSocket握手的过程建立WebSocket连接。此过程从客户端向服务器发送常规HTTP请求开始。此请求中包含一个升级头,通知服务器客户端希望建立WebSocket连接

现在握手完成后,初始HTTP连接被使用相同底层TCP/IP连接的WebSocket连接所取代。此时,任何一方都可以开始发送数据


好的,但正如我所说的,我使用了ws。而且我不知道如何获取
连接:升级获取ws://websocket.example.com/HTTP/1.1 Origin:http://example.comConnection: 升级连接:升级主机:websocket.example.com连接:升级升级:websocket
毫无疑问,WS已与一台服务器一起使用,该服务器正确地实现了握手/接受传入数据WS请求。上面的代码没有-因为它无法遵守定义的协议-并且预计不会工作。我强烈建议使用
System.Net.HttpListener
,它可以通过
HttpListenerContext
/
HttpListenerRequest
为您建立
System.Net.Websocket
连接。好的。我现在就去做。我会尽快回来的。事实上,它告诉你如何使用
HttpListener
进行设置。我不知道
从哪里获取ws://websocket.example.com/HTTP/1.1来源:http://example.com 连接:升级主机:websocket.example.com升级:websocket
goes。我是否正确地用C#或JavaScript完成握手?JS端是正确的,由浏览器和WebSocket类型实现(它正确地发送初始握手并等待连接升级)。C端是不正确的,因为它从未完成所需的握手。要么编写(最低限度)有效的实现(参见RFC等),要么使用现有的有效库,了解如何接受WS-handshake/连接。一个最低限度有效的实现可能只返回所需的HTTP和“升级”头。非常感谢你。
IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = IPAddress.Parse("ip");
IPEndPoint localEndPoint = new IPEndPoint(ipAddr, 11111);

Socket listener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

try
{
    listener.Bind(localEndPoint);

    listener.Listen(10);

    while (true)
    {

        Console.WriteLine("Waiting connection...");

        Socket clientSocket = listener.Accept();

        byte[] bytes = new Byte[1024];
        string data = null;

        while (true)
        {

            int numByte = clientSocket.Receive(bytes);

            data += Encoding.ASCII.GetString(bytes, 0, numByte);

            if (data.IndexOf("<EOF>") > -1)
            {
                break;
            }
        }

        Console.WriteLine("Text received -> {0} ", data);
        byte[] message = Encoding.ASCII.GetBytes("Test Server");

        clientSocket.Send(message);

        clientSocket.Shutdown(SocketShutdown.Both);
        clientSocket.Close();
    }
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
}
socket = new WebSocket("wss://ip:11111");
socket.onopen = function()
{
    alert("Connected!");
}
socket.onerror = function()
{
    alert("Connection Failed");
}