【发布时间】:2020-09-03 16:28:50
【问题描述】:
大约 4 小时的研究……我们开始吧。
我有一个 C# 程序,它发送和侦听来自特定 Socket 的任何内容。使用套接字,C# 可以向它发送东西,也可以从它那里接收。现在,转到我的 JavaScript 文件,我正在使用 WebSocket 接口与 C# 通信,但不起作用(通常在几分钟后超时)。当 Socket 在线时,JavaScript 代码最多需要大约 4 分钟,然后抛出一个错误,说“WebSocket 打开握手超时”。问题是我知道它可以找到,因为当 ip 的端口不存在时,JavaScript 文件会在接下来的几秒钟内引发错误。
我做过的事情:
关闭所有防火墙,ip和端口开头同时使用ws和wss(例如:wss://xxx.xxx.x.xx:11111),更改端口,更改ip为有效ip仍然可以到达,研究 4 小时。
C#:
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());
}
JavaScript:
socket = new WebSocket("wss://ip:11111");
socket.onopen = function()
{
alert("Connected!");
}
socket.onerror = function()
{
alert("Connection Failed");
}
ip是本地的
长话短说,C# 可以与自己通信,而 JavaScript 可以找到它但无法与之通信。
【问题讨论】:
-
好的,但正如我所说,我使用过 ws。另外,我不知道如何获得
Connection: Upgrade GET ws://websocket.example.com/ HTTP/1.1 Origin: http://example.comConnection: Upgrade Connection: Upgrade Host: websocket.example.comConnection: Upgrade Upgrade: websocket -
我毫不怀疑 WS 已与正确实现握手/接受传入 WS 请求的服务器一起使用。上面的代码没有 - 因为它没有遵守定义的协议 - 并且预计不会工作。
-
我强烈建议使用
System.Net.HttpListener,它可以通过HttpListenerContext/HttpListenerRequest为您建立System.Net.Websocket连接。 -
好的。我现在就解决这个问题。等我弄清楚了,我会尽快回来的。
-
其实this answer告诉你如何使用
HttpListener进行设置。
标签: javascript c# html sockets websocket