嗨,我在用java脚本代码创建套接字通信时遇到问题。
我总是在发送消息或从服务器关闭套接字时出错。
我的Socket服务器代码
// Start listening for connections.
while (true)
{
Console.WriteLine("Waiting for a connection...");
// Program is suspended while waiting for an incoming connection.
Socket handler = listener.Accept();
data = null;
// An incoming connection needs to be processed.
while (true)
{
int bytesRec = handler.Receive(bytes);
data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
break;
}
// Show the data on the console.
Console.WriteLine("Text received : {0}", data);
// Echo the data back to the client.
byte[] msg = Encoding.ASCII.GetBytes(data);
handler.Send(msg);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
JavaScript代码:
var connection = new WebSocket('ws://Myip:11000', ['soap', 'xmpp']);
// When the connection is open, send some data to the server
connection.onopen = function () {
connection.send('Ping'); // Send the message 'Ping' to the server
connection.send('your message');
};
// Log errors
connection.onerror = function (error) {
console.log('WebSocket Error ' + error);
};
connection.onclose = function (msg) {
console.log('WebSocket Error ' + msg);
};
它连接到服务器套接字,但在关闭服务器或从服务器发送消息时总是出错。
如果这真的是你的实际代码:
handler.Send(msg);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
…然后它就坏了。首先,你不能假设Socket.Send()实际上发送了你要求它发送的所有字节。你必须检查返回值,并一直发送,直到你真正发送了所有数据。
其次,优雅闭包的启动应该使用SocketShutdown.Send,而不是SocketShudown.Both。指定"Both"意味着(除其他外)你不会等待另一端协商优雅闭包。你刚刚完成,除了发送之外,甚至不会再收到任何数据。
当然,在另一端实际确认优美的闭包之前,代码正在调用Close()(通过自己发送想要发送的任何剩余数据,然后用"Both"关闭)。
所有这些都是你问题的原因吗?我不能肯定,因为我没有办法测试你的实际代码。但这肯定是一个合理的猜测。如果你在尝试发送东西后没有等待就断开了连接,就不能保证数据会离开你的机器,而且在任何情况下,另一端都可以很容易地看到连接重置,然后才有机会处理发送给它的任何数据。
当涉及到套接字编程时,没有大量的规则,但存在哪些规则是有原因的,并且通常非常重要。您应该确保您的代码符合所有规则。
(代码的其余部分也与我认为的正确做法不同,但这些问题并不是完全致命的,就像过度渴望的连接破坏一样)。
恐怕WebSocket不能以这种方式工作。
当Javascript代码连接到服务器时,它将以ASCII文本的形式发送HTTP请求。该请求将包括一个HTTP标头Sec-WebSocket-Protocol: soap, xmpp
,因为您在创建WebSocket
时需要这些协议。
由于您的服务器代码没有回复接受websocket连接的适当HTTP响应,因此连接将失败。当您尝试将数据发回时,客户端将不会将其识别为HTTP响应,并且会引发错误。
websocket不是一个常规的套接字连接,它不会以这种方式工作。它需要HTTP协商,并且有一个用于数据帧的模式。我建议你仔细阅读这篇文章,它很好地解释了它的工作原理:http://chimera.labs.oreilly.com/books/1230000000545/ch17.html
如果您有兴趣学习如何开发服务器,请参阅MDN中的本教程:https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_server我还有一个开源的C#WebSocket服务器,如果你喜欢的话,你可以看看。