【问题标题】:Is there a .ReadLine() function for NetworkStream or something similar to it?NetworkStream 是否有 .ReadLine() 函数或类似的函数?
【发布时间】:2019-10-21 23:30:37
【问题描述】:

我是 TCP 客户端和与主机通信的新手,如果这看起来是个愚蠢的问题,我很抱歉。

我正在创建一个与设备通信的串行/TCP 应用程序。由于我已经为应用程序的串行部分编写了大部分代码,而 TCP 是我的新任务,我正在尽最大努力使其相互兼容。当我与串行设备通信时,我使用.ReadLine() 检索数据,但NetworkStream(我用来从主机检索数据)没有此功能。有没有办法自己实现或编写这个功能?

我所做的只是从 NetworkStream 中检索字节数组中的数据,然后将其转换为 ASCII,但这种方法不适合我...

编辑:

        private void Button_TCP_Connect_Click(object sender, EventArgs e)
        {
            try
            {
                Int32 port = Convert.ToInt32(TextBox_TCP_Port.Text);
                String server = TextBox_TCP_Server.Text;
                var IP = IPAddress.Parse(TextBox_TCP_Host.Text);

                TCP = new TcpClient();
                TCP.Connect(IP, port);

                if (TCP.Connected)
                {
                    TextBox_System_Log.Text = "***CONNECTED***" + Environment.NewLine + "Host: " + IP.ToString()
                        + Environment.NewLine + "Port: " + port.ToString() + Environment.NewLine;
                    tcpConnection = true;


                    Stream = TCP.GetStream();

                    Timer_NetworkStream.Enabled = true;
                    Timer_NetworkStream.Start();

                    byte[] buffer = new byte[4096];

                    Stream.BeginRead(buffer, 0, buffer.Length, ReadComplete, buffer);
                }
            }
            catch (SocketException exception)
            {
                MessageBox.Show(exception.ToString());
            }
        }
            void ReadComplete(IAsyncResult iar)
            {

                byte[] buffer = (byte[])iar.AsyncState;

                int bytesAvailable = Stream.EndRead(iar);

                int lastIndex = Array.FindLastIndex(buffer, b => b != 0);
                Array.Resize(ref buffer, lastIndex + 1);
                SetText(System.Text.Encoding.ASCII.GetString(buffer));

            Stream.BeginRead(buffer, 0, buffer.Length, ReadComplete, buffer);
        }

我添加了用于创建TCP clientNetworkStream 的代码。由于它不是基于事件的,并且我不断地从主机接收数据,因此我使用.BeginRead() 作为一种解决方法,它在接收数据时触发。 StreamReader 似乎不是一个好的选择,因为它使用循环来迭代行,这会冻结我的应用程序的 GUI。将StreamReader 放入BackgroundWorker 不是一个选项,因为我的应用程序已经在使用它。

【问题讨论】:

  • StreamReader包装它
  • 重要:这是一个严肃的服务器吗?还是一些微不足道的/内部的东西?很重要;如果这是一个严肃的服务器,ReadLine 是一个糟糕的想法,它可以让你的服务器在 DOS 等方面变得非常容易。如果它是微不足道的/内部的,那可能没关系。
  • 这是一个严肃的服务器。那么你会推荐什么其他方法。因为主要是我需要以行格式接收数据,因为我需要事后检查它们是否有重要数据等。逐行检查似乎比只检查一段文本要好......

标签: c# sockets tcp networkstream


【解决方案1】:

如果nws 是您的信息流,那么

var reader = new StreamReader(nws);
var myString = reader.ReadLine();

做你想做的。

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2013-05-03
    • 2011-08-01
    • 2014-06-14
    相关资源
    最近更新 更多