2014-10-17 21 views
0

您好,我在创建Java脚本代码的套接字通信时遇到了问题。从javascript中的套接字获取信息时出错

我在发送消息或从服务器关闭套接字时总是出错。

我的套接字服务器代码。

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

它获取连接到服务器套接字,但总是得到错误,同时关闭或从服务器发送消息。

回答

1

如果这真的是你的实际代码:

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

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

其次,优雅封闭的启动应该使用SocketShutdown.Send,而不是SocketShutdown.Both。指定“Both”意味着(除其他之外)你不会等待另一端谈判优雅的结束。您刚刚完成,除了发送完毕之外,甚至不会收到更多数据。

当然,代码在调用Close()之前,事实上已经确认了优雅闭包(通过它自己发送剩余的数据,然后用“Both”关闭)。

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

有关套接字编程的规则并不多,但存在哪些规则是有原因的,一般来说真的是很重要。你应该确保你的代码遵循所有的规则。 (其余的代码也不同于我认为正确的做事方式,但问题并不完全是致命的,即过度渴望的连接销毁的方式)。

+0

感谢您的回复,是的,您是对的,我刚刚开始使用此套接字编程,并且没有找到任何可靠的来源。如果你能帮助我,我会很高兴。 – Rex 2014-10-17 09:25:49

1

恐怕WebSocket不能这样工作。

当Javascript代码连接到服务器时,它会发送一个HTTP请求作为ASCII文本。该请求将包含一个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#可以看看你是否喜欢。

+0

谢谢,我正在检查你的链接:) – Rex 2014-10-17 09:48:19