gpt4 book ai didi

c# - 从 NetworkStream 异步读取时出错

转载 作者:太空宇宙 更新时间:2023-11-03 16:39:20 26 4
gpt4 key购买 nike

我已经制作了一个与网络摄像机通信的应用程序。它被配置为在预定义地址上建立连接。 TCP Listener 正在该地址上运行并接受来自摄像头的连接。当相机连接时,我发送命令以从相机获取 MJpeg 流,相机开始发送流以响应命令。

我正在使用异步方法从套接字读取流。但是一段时间后,我的应用程序在从网络流中读取数据时卡住了。

我正在使用此代码从网络流中读取数据,并且我在屏幕上写了一些消息以获取相机连接状态。

    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 方法。希望这会有所帮助。

关于c# - 从 NetworkStream 异步读取时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8134168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com