从javascript中的套接字获取消息时出错



嗨,我在用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服务器,如果你喜欢的话,你可以看看。

相关内容

  • 没有找到相关文章

最新更新