【问题标题】:Continuously read data from a server in C#.net从 C#.net 中的服务器连续读取数据
【发布时间】:2018-08-27 16:54:01
【问题描述】:

我的系统与某个服务器相连。我正在从服务器读取数据。 但我想从服务器连续读取数据。 这是我的代码:

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 循环放置在何处以便能够连续收听的逻辑?

【问题讨论】:

  • 连续阅读你需要一个循环。但我猜你想要的是“连续并同时”。那就是“不阻塞你的主线程” - 所以你需要一个普通的旧线程(或线程池,更好)或异步方法。
  • 你需要实现Long polling,搜索一下。
  • 不不,只是主线程。数据流将来自单个 IP 地址。

标签: c# .net server client listener


【解决方案1】:

只是添加了循环而不改变你的代码:

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

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

  • 更改循环条件以指示何时停止阅读;
  • 在没有数据可用时添加睡眠以避免浪费处理器时间;
  • 添加错误处理;
  • 使用异步方法重写您的代码。

【讨论】:

  • 它工作正常,但它从服务器读取并打印消息三次(恰好 3 次),然后无限次读取 0 字节(无)。
【解决方案2】:

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

例如:

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

【讨论】:

  • 帮不了兄弟。请编辑我的代码并放置一个循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 2023-03-30
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多