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

时间:2014-10-17 04:54:25

标签: javascript sockets asp.net-mvc-4 c#-4.0 websocket

您好我从使用java脚本代码创建套接字通信时遇到了问题。

发送邮件或从服务器关闭套接字时,我总是收到错误。

我的套接字服务器代码。

        // 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);
};

它连接到服务器套接字,但在关闭或从服务器发送消息时总是会出错。

2 个答案:

答案 0 :(得分:1)

如果这确实是您的实际代码:

handler.Send(msg);
handler.Shutdown(SocketShutdown.Both);
handler.Close();

......然后它很糟糕。首先,您不能假设Socket.Send()实际上发送了您要求它的所有字节。您必须检查返回值,并继续发送,直到您实际发送了所有数据。

其次,优雅闭包的启动应该使用SocketShutdown.Send,而不是SocketShutdown.Both。指定"两者"意味着(除其他外)你不会等待另一端谈判优雅的关闭。除了完成发送之外,您刚刚完成并甚至不会再收到任何数据。

当然,代码在另一端实际上已经确认优雅闭包之前调用Close()(通过自身发送它想要发送的任何剩余数据然后用&#34关闭;两者")

这就是你问题的原因吗?我无法肯定地说,因为我无法测试您的实际代码。但这肯定是一个合理的猜测。如果您在尝试发送内容后没有等待就断开连接,那么就不能保证数据永远不会离开您的机器,并且在任何情况下,另一端可以在它获得机会之前轻松看到连接重置处理发送给它的任何数据。

在套接字编程方面没有大量的规则,但存在哪些规则是有原因的,并且通常非常很重要。您应该确保您的代码遵循所有规则。

(代码的其余部分也与我认为正确的做事方式不同,但问题并不是完全致命的,即过度紧急的连接破坏的方式)。

答案 1 :(得分:1)

我担心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如果您愿意,我也可以open source WebSocket server in C#查看。