NetworkStream是否具有.ReadLine()函数或类似的函数?

Zie*_*ema 2 c# sockets tcp networkstream

我是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);
        }
Run Code Online (Sandbox Code Playgroud)

我添加了用于创建TCP client和的代码NetworkStream。由于它不是基于事件的,并且我不断从主机接收数据,因此我将其.BeginRead()作为一种变通方法,在收到数据时会触发。StreamReader似乎不是一个好选择,因为它使用循环遍历行,这将冻结我的应用程序的GUI。放置StreamReaderinot a BackgroundWorker不是一个选择,因为我的应用程序已在使用它。

Ste*_*odd 5

如果nws是您的流,那么

var reader = new StreamReader(nws);
var myString = reader.ReadLine();
Run Code Online (Sandbox Code Playgroud)

做你想要的。