C# 从网络流异步读取时出错
我已经做了一个应用程序与IP摄像头通信。配置为在预定义地址上建立连接的。TCP侦听器正在该地址上运行,并接受来自摄像机的连接。当相机连接时,我发送命令从相机获取MJpeg流,相机开始响应命令发送流 我正在使用异步方法从套接字读取流。但过了一段时间,我的应用程序在从网络流读取数据时被卡住了 我用这个代码从网络流中读取数据,我在屏幕上写了一些消息来获取摄像头连接的状态C# 从网络流异步读取时出错,c#,network-programming,tcplistener,C#,Network Programming,Tcplistener,我已经做了一个应用程序与IP摄像头通信。配置为在预定义地址上建立连接的。TCP侦听器正在该地址上运行,并接受来自摄像机的连接。当相机连接时,我发送命令从相机获取MJpeg流,相机开始响应命令发送流 我正在使用异步方法从套接字读取流。但过了一段时间,我的应用程序在从网络流读取数据时被卡住了 我用这个代码从网络流中读取数据,我在屏幕上写了一些消息来获取摄像头连接的状态 private void ReadData() { try {
private void ReadData()
{
try
{
string msg = "Reading Data... client connected " + _camClient.Connected.ToString() +
"... netStream Readable " +
_netStream.CanRead.ToString();
Console.WriteLine(msg);
_callback = new AsyncCallback(GetData);
_buffer = new byte[Buffersize];
_async = _netStream.BeginRead(_buffer, 0, Buffersize, _callback, null);
}
catch (Exception ex) { Console.WriteLine("ReadData: " + ex.Message); }
}
private void GetData(IAsyncResult result)
{
try
{
int read = _netStream.EndRead(result);
if (read > 0)
{
_data = new byte[read];
Array.Copy(_buffer, 0, _data, 0, read);
ProcessData();
}
ReadData();
}
catch (Exception ex) { Console.WriteLine("GetData: " + ex.Message); }
}
首先,网络流上的异步方法以丢失数据或从不返回数据而闻名! 在您的情况下,可能是ProcessData调用被阻塞 您应该做的是使用阻塞侦听器(非异步)生成一个新的后台线程,然后在侦听器继续侦听时使用一个新线程读取数据。 我这里有一个例子
private static Socket s_chatListener;
public static void Listen(IPAddress LocalIPAddress, int Port)
{
IPEndPoint ipend = new IPEndPoint(LocalIPAddress, Port);
s_chatListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s_chatListener.Bind(ipend);
s_chatListener.Listen(10);
while (true)
{
Socket handler = s_chatListener.Accept();
ParameterizedThreadStart pst = new ParameterizedThreadStart(loadMessageFromSocket);
Thread t = new Thread(pst);
t.Start(handler);
}
}
private static void loadMessageFromSocket(object socket)
{
Socket handler = (Socket)socket;
string data = "";
while (true)
{
byte[] butes = new byte[1024];
int rec = handler.Receive(butes);
data += ASCIIEncoding.ASCII.GetString(butes);
if (data.IndexOf("\0") > -1)
break;
}
handler.Shutdown(SocketShutdown.Both);
handler.Close();
Console.Write(data);
}
现在只需从主窗体或调用方类中的新线程调用Listen方法。
希望这有帮助。首先,网络流上的异步方法以丢失数据或从不返回数据而闻名! 在您的情况下,可能是ProcessData调用被阻塞 您应该做的是使用阻塞侦听器(非异步)生成一个新的后台线程,然后在侦听器继续侦听时使用一个新线程读取数据。 我这里有一个例子
private static Socket s_chatListener;
public static void Listen(IPAddress LocalIPAddress, int Port)
{
IPEndPoint ipend = new IPEndPoint(LocalIPAddress, Port);
s_chatListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s_chatListener.Bind(ipend);
s_chatListener.Listen(10);
while (true)
{
Socket handler = s_chatListener.Accept();
ParameterizedThreadStart pst = new ParameterizedThreadStart(loadMessageFromSocket);
Thread t = new Thread(pst);
t.Start(handler);
}
}
private static void loadMessageFromSocket(object socket)
{
Socket handler = (Socket)socket;
string data = "";
while (true)
{
byte[] butes = new byte[1024];
int rec = handler.Receive(butes);
data += ASCIIEncoding.ASCII.GetString(butes);
if (data.IndexOf("\0") > -1)
break;
}
handler.Shutdown(SocketShutdown.Both);
handler.Close();
Console.Write(data);
}
现在只需从主窗体或调用方类中的新线程调用Listen方法。
希望这能有所帮助。当它卡住时,最后一条消息是什么?我看到最后一条消息是“正在读取数据…客户端连接正确…netStream可读正确”。在这个消息应用程序被阻塞之后。当它被阻塞时,最后一条消息是什么?我看到最后一条消息是“正在读取数据…客户端连接为真…netStream可读为真”。在这个消息应用程序被阻塞之后。嗨,詹姆斯·詹金斯!在我们的场景中,我们的客户端是一个ip摄像头,所以我们得到的流是对发送给摄像头的命令的响应,摄像头开始无限地发送Mjpeg流,所以我如何在我们的场景中使用此代码。只是不要使用异步。启动一个新线程,将命令发送到IP摄像头,然后读取流,您可以使用StreamReader。然后,当您将图像设置为通知调用者的事件时。James我们不知道图像的数量,摄像头开始发送流,当我们在终端接收数据时,我们从流中获取图像。摄像头开始以这种方式发送流,我们在应用程序中分离图像“内容类型:多部分/x-mixed-replace;boundary=--myboundary…“…--myboundary.Content-type:image/jpeg…”jpeg二进制数据第1号(十六进制表示法=“FFD8…”FFD9”)“…--myboundary.Content-type:image/jpeg…”jpeg二进制数据第2号(十六进制表示法=“FFD8…”FFD9”):”…--myboundary.Content-type:image/jpeg…“jpeg二进制数据编号N(十六进制表示法=“FFD8…”FFD9”)嗨,James Jenkins!在我们的场景中,我们的客户端是一个ip摄像头,因此我们收到了发送给摄像头的命令的响应流,摄像头开始无限地发送Mjpeg流,因此我如何在我们的场景中使用此代码。只需不使用异步。启动一个新线程,将命令发送到ip摄像头,然后读取流,您可以使用StreamReader。然后,当您将图像设置为通知调用者的事件时。James我们不知道图像的数量,摄像头开始发送流,当我们在端部接收数据时,我们从流中获取图像。摄像头开始以这种方式发送流,我们在应用程序中分离图像”内容类型:multipart/x-mixed-replace;boundary=--myboundary…“…--myboundary.Content-type:image/jpeg…”jpeg二进制数据第1号(十六进制表示法=“FFD8…”FFD9”)“…--myboundary.Content-type:image/jpeg…”jpeg二进制数据第2号(十六进制表示法=“FFD8…”FFD9”):”…--myboundary.Content-type:image/jpeg…“jpeg二进制数据编号N(十六进制表示法=“FFD8…”FFD9”)