我是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 client
和我的NetworkStream
的代码。由于它不是基于事件的,并且我一直在从主机接收数据,因此我使用.BeginRead()
作为一种变通方法,它会在接收到数据时触发。 StreamReader
似乎不是一个好选择,因为它使用循环遍历行,这会冻结我的应用程序的GUI。不能将StreamReader
放在BackgroundWorker
上,因为我的应用程序已在使用它。
答案 0 :(得分:5)
如果nws
是您的信息流,则
var reader = new StreamReader(nws);
var myString = reader.ReadLine();
做你想要的。