从C#.net中的服务器连续读取数据

问题描述 投票:0回答:2

我的系统连接了一些服务器。我正在从服务器上读取数据。但我想从服务器不断读取数据。这是我的代码:

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循环的逻辑能够连续听吗?

c# .net server client listener
2个回答
0
投票

要连续接收数据,您实际上需要放入一些循环。

例如:

 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);
}

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();

这样它将无限地从主线程中的服务器请求数据。其他改进可能是:

  • 改变循环条件以指示何时想要停止阅读;
  • 没有可用数据时添加睡眠以避免浪费处理器时间;
  • 添加错误处理;
  • 使用异步方法重写代码。
© www.soinside.com 2019 - 2024. All rights reserved.