簡體   English   中英

C#套接字服務器無法多次從同一客戶端連接接收數據

[英]C# sockets server unable to receive data from same client connection more than once

我最近問了一個相關的問題, 在C#中我如何讓套接字繼續保持打開狀態並接受新數據? 並解決了一些問題,但是現在我很難讓我的服務器不止一次從同一客戶端接收數據。

我已經在VS中使用Windows窗體編寫了一個簡單的套接字服務器,該服務器具有一個調用接收函數的按鈕

public void Receive()
    {
        try
        {
            byte[] bytes = new byte[256];
            received = s1.Accept().Receive(bytes);
            receivedText.Text += System.Text.ASCIIEncoding.ASCII.GetString(bytes);
        }
        catch (SocketException e)
        {
            Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
            return;
        }
    }

如果我是第一次從客戶端發送郵件,它會起作用,但是如果我嘗試發送其他郵件,然后單擊“接收”,則服務器只會循環,並且永遠不會拾取新數據。 但是,如果我從其他地方發送,或者從客戶端重新啟動連接,則可以發送數據。

我希望服務器能夠一次從同一客戶端接收任何數量的數據。 請詢問您是否需要更多代碼/細節。 不確定什么是相關的,因為我是套接字編程的新手。

每個客戶端只能調用一次Accept(),而不必每次都希望接收新數據。 Accept()基本上等待客戶端連接到服務器套接字s1(並返回一個新的套接字以與此客戶端發送/接收數據),因此在這里每次調用Receive()函數時,套接字都會等待另一個客戶端進行連接連接,這就是為什么它只能運行一次的原因。

這是一個示例(代碼來自您先前的問題):

s1.Bind(endP);
s1.Listen(10);
Socket s2 = s1.Accept(); // Waits for a client to connect and return a socket, s2, to communicate with him
while (true) {
    Receive(s2);
}
...

Receive()函數:

public void Receive(Socket s)
{
    try
    {
        byte[] bytes = new byte[256];
        received = s.Receive(bytes);
        receivedText.Text += System.Text.ASCIIEncoding.ASCII.GetString(bytes);
    }
    catch (SocketException e)
    {
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
        return;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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