[英]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.