【问题标题】:Is it perfectly ok to use ReadLineAsync for client-server communication使用 ReadLineAsync 进行客户端-服务器通信是否完全可以
【发布时间】:2016-01-28 09:03:24
【问题描述】:

我正在尝试实现客户端-服务器通信,它应该支持以换行符结尾的命令。这样做完全可以吗:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        RunServer();
    }

    async private Task RunServer()
    {
        var listener = new TcpListener(IPAddress.Any, 1065);
        listener.Start();
        while (true)
        {
            TcpClient client = await listener.AcceptTcpClientAsync();
            HandleClient(client);
        }
    }

    async private Task HandleClient(TcpClient client)
    {
        using (var networkStream = client.GetStream())
        using (var reader = new StreamReader(networkStream))
        {
            var dataFromServer = await reader.ReadLineAsync(); // here
            MessageBox.Show("Received \"" + dataFromServer + "\"");
        }
    }
}

或者我应该使用AsyncRead 并检查接收到的缓冲区是否包含'\n' 字符而不是?

它在任何情况下都能正常工作,即使消息将被分成几个 IP 数据包?

【问题讨论】:

  • 我投票结束这个问题,因为它属于CodeReview
  • @FrozenHeart:有什么理由不使用 SignalR 吗? SignalR 比原始套接字更易于使用几个数量级。

标签: c# tcp network-programming


【解决方案1】:

我认为使用 ReadLineAsync 而不是 ReadAsync 更好:您正在阅读一行,不需要额外的 if 语句,也不需要额外的循环。

【讨论】:

  • 在任何情况下都能正常工作,即使消息会被分成几个IP包?
  • 你能举个例子吗:这是漫长的一天,所以我可能会误解它。您有一条消息可以包含多行 IP 地址,对吗?所以你有 127.0.0.1\n127.0.0.2 (新行在 cmets 中不起作用)。
  • 没有。假设来自客户端的请求“some_command\n”将被分成两个数据包(例如,“some_”和“command\n”)。无论如何它会起作用吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多