2014-10-17 43 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