簡體   English   中英

從C#.net中的服務器連續讀取數據

[英]Continuously read data from a server in C#.net

我的系統已連接到某些服務器。 我正在從服務器讀取數據。 但我想從服務器連續讀取數據。 這是我的代碼:

TcpClient client = new TcpClient("169.254.74.65", 7998);
NetworkStream stream = client.GetStream();
Byte[] data = new Byte[1024];
String responseData = String.Empty;
Int32 bytes = stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
Console.WriteLine("Received: {0}", responseData);
stream.Close();
client.Close();

有人可以告訴我邏輯,在哪里放置while循環以連續收聽嗎?

為了連續接收數據,實際上您需要進行一些循環。

例如:

 private void StartProcessing(Socket serverSocket)
{
    var clientSocket = serverSocket.Accept();
    StartReceiveing(clientSocket);
}

private void StartReceiveing(Socket clientSocket)
{
    const int maxBufferSize = 1024;

    try
    {
        while (true)
        {
            var buffer = new byte[maxBufferSize];

            var bytesRead = clientSocket.Receive(buffer);

            if (ClientIsConnected(clientSocket))
            {
                var actualData = new byte[bytesRead];

                Array.Copy(buffer, actualData, bytesRead);
                OnDataReceived(actualData);
            }
            else
            {
                OnDisconnected(clientSocket);
            }
        }
    }
    catch (SocketException ex)
    {
        Console.WriteLine(ex.Message);
    }
}

private void OnDisconnected(Socket issuedSocket)
{
    if (issuedSocket != null)
    {
        issuedSocket.Shutdown(SocketShutdown.Both);
        issuedSocket.Close();

        StartProcessing(listener);
    }
}

private void OnDataReceived(byte[] data)
{
    //do cool things
}

private static bool ClientIsConnected(Socket socket)
{
    return !(socket.Poll(1000, SelectMode.SelectRead) && socket.Available == 0);
}

只需添加循環而不更改代碼即可:

TcpClient client = new TcpClient("169.254.74.65", 7998);
NetworkStream stream = client.GetStream();
Byte[] data = new Byte[1024];
String responseData = String.Empty;
Int32 bytes;
while(true) {
    bytes = stream.Read(data, 0, data.Length);
    if (bytes > 0) {
        responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
        Console.WriteLine("Received: {0}", responseData);
    }
}
stream.Close();
client.Close();

這樣,它將無限期地從主線程中向服務器請求數據。 其他改進可能是:

  • 更改循環條件以指示您何時要停止閱讀;
  • 當沒有可用數據時增加睡眠以避免浪費處理器時間;
  • 添加錯誤處理;
  • 使用異步方法重寫您的代碼。

暫無
暫無

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

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