[英]Simple socket server in C# unexpectedly closes connection when trying to write data to client
我試圖弄清楚為什么此C#代碼:
int port = 8080;
var localAddr = IPAddress.Parse("127.0.0.1");
var server = new TcpListener(localAddr, port);
server.Start();
Console.WriteLine("Waiting for a connection... ");
var client = server.AcceptTcpClient();
Console.WriteLine("Connected!"); // Writes to console when "open" button
// is pushed in browser.
NetworkStream stream = client.GetStream();
while (client.Connected) // successfully loops twice.
{
string message = DateTime.Now.ToString();
byte[] msg = Encoding.ASCII.GetBytes(message);
stream.Write(msg, 0, msg.Length); // Exception is thrown here; data
// is never received in browser.
Console.WriteLine("Sent: {0}", message);
Thread.Sleep(1000);
}
client.Close();
引發以下異常(在上面的代碼注釋中引用):
System.dll中發生了'System.IO.IOException'類型的未處理異常
附加信息:無法將數據寫入傳輸連接:主機中的軟件中止了已建立的連接。
我在瀏覽器上使用的代碼如下所示:
<!DOCTYPE html>
<html>
<head>
<title>Socket Test</title>
</head>
<body>
<div>
<input id=message size=50 />
<button type="button" onclick="sendMessage();" >Send</button> <br />
<button type="button" onclick="openSocket();" >Open</button>
<button type="button" onclick="closeSocket();" >Close</button>
</div>
<div id="messages"></div>
<script type="text/javascript">
var webSocket;
var messages = document.getElementById("messages");
function openSocket(){
if(webSocket !== undefined && webSocket.readyState !== WebSocket.CLOSED){
writeResponse("WebSocket is already opened.");
return;
}
webSocket = new WebSocket("ws://127.0.0.1:8080");
webSocket.onopen = function(event){
writeResponse("Connection opened.");
};
webSocket.onmessage = function(event){
writeResponse(event.data);
};
webSocket.onclose = function(event){
writeResponse("Connection closed with event code " + event.code);
};
webSocket.onerror = function(event){
writeResponse(event.data);
};
}
function closeSocket(){
webSocket.close();
}
function sendMessage(){
webSocket.send(message.value);
}
function writeResponse(text){
messages.innerHTML += "<br/>" + text;
}
</script>
</body>
</html>
...我知道的效果很好,因為我可以更改路線
webSocket = new WebSocket("ws://127.0.0.1:8080");
至
webSocket = new WebSocket("ws://echo.websocket.org");
並獲得良好的連接並從http://websocket.org回顯答復。
注意:與websocket.org測試不同,瀏覽器從不報告已與C#服務器打開連接,即使C#服務器認為已建立成功連接也是如此。
您不能使用TCP套接字直接與WebSocket通信。 WebSockets建立在HTTP之上,並且初始請求是一個HTTP請求,用於進行握手並從HTTP連接升級到WebSocket連接,因此您將需要首先實現小型http服務器來處理HTTP連接升級請求。
升級頭看起來像這樣
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
因此,您可以使用現有的庫或閱讀https://tools.ietf.org/html/rfc6455的相關部分
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.