C# NetworkStream.Read未获取空字节后的所有字节
我正在制作一个应用程序,可以远程控制一个设备,比如一个摄像头(ScopiaXT5000-Radvision)。我需要向设备发送初始化命令,以便能够发送控制设备的AT命令 一旦我发送了初始化命令,服务器应该回复:C# NetworkStream.Read未获取空字节后的所有字节,c#,sockets,null,byte,networkstream,C#,Sockets,Null,Byte,Networkstream,我正在制作一个应用程序,可以远程控制一个设备,比如一个摄像头(ScopiaXT5000-Radvision)。我需要向设备发送初始化命令,以便能够发送控制设备的AT命令 一旦我发送了初始化命令,服务器应该回复: 字符串形式 ??\0\0\0 AT[Read返回读取的字节数。您有一个10025字节的缓冲区,但在Read后缓冲区未满。您可能需要循环,直到读取所有需要的字节 它在调试时起作用,因为用额外的时间,网络流有时间完全接收结果,因此当调用Read时,所有数据都可用并放入缓冲区 参考资料:如果您
字符串形式
??\0\0\0 AT[
Read
返回读取的字节数。您有一个10025字节的缓冲区,但在Read
后缓冲区未满。您可能需要循环,直到读取所有需要的字节
它在调试时起作用,因为用额外的时间,网络流有时间完全接收结果,因此当调用Read
时,所有数据都可用并放入缓冲区
参考资料:如果您从网络中读取而未存储读取方法返回的计数,则表明您犯了一个基本的编程错误。您好,EJP,感谢您向我提供有关从网络读取的信息,但是我将如何处理返回的计数?是否真的需要存储它?您能否给我一个示例,说明正在使用返回的unt?第四点是,您假设读取已填充缓冲区,而不是使用计数来确定缓冲区中有多少是上次读取的结果。这就是为什么您会看到奇怪的数据。读取后,您应该只使用返回计数指示的缓冲区。嗨,Kieren,感谢您的帮助快速响应..你能给我一个你所说的循环的例子吗?因为我试图循环我的
读取
,直到没有可用的数据,它只循环一次。另一个问题@Kieren,有没有办法等待网络流完全接收结果?我想这就是循环的作用?或者循环有什么功能直到您读取了所需的所有数据—例如,如果数据包的末尾有一个终止符,请继续读取,直到您获得该终止符为止
{
TcpClient clientSocket = new System.Net.Sockets.TcpClient();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
msg("Client Started");
}
public void openSocket()
{
if (clientSocket.Connected)
{
clientSocket.Close();
}
clientSocket = new System.Net.Sockets.TcpClient();
clientSocket.Connect("10.0.3.202", 55003);
label1.Text = "Client Socket Program - Server Connected ...";
}
private void btnSend_Click(object sender, EventArgs e)
{
openSocket();
//header bytes and initAT bytes are the initialization command for me to send AT commands
msg("Init: ");
NetworkStream serverStream = clientSocket.GetStream();
//header bytes to enable AT command
byte[] header = {170,170,0,0,0,8 };
serverStream.Write(header, 0, header.Length);
serverStream.Flush();
//Initialize the Interface
byte[] initAT = System.Text.Encoding.ASCII.GetBytes("AT[&IPV\r");
serverStream.Write(initAT,0, initAT.Length);
serverStream.Flush();
byte[] inStream = new byte[10025];
serverStream.Read(inStream, 0, inStream.Length);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
msg("Data from Server : " + returndata);
}
private void btnRight_Click(object sender, EventArgs e)
{
msg("Right : ");
NetworkStream serverStream = clientSocket.GetStream();
//AT Command to move the main camera to right
byte[] outStream3 = System.Text.Encoding.ASCII.GetBytes("AT[&SY011R\r");
serverStream.Write(outStream3, 0, outStream3.Length);
byte[] inStream2 = new byte[48];
serverStream.Read(inStream2, 0,inStream2.Length);
string returndata = System.Text.Encoding.ASCII.GetString(inStream2);
msg(returndata);
}
public void msg(string mesg)
{
textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + mesg;
}
}