簡體   English   中英

嘗試將數據寫入客戶端時,C#中的簡單套接字服務器意外關閉連接

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM