Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从网络流异步读取时出错_C#_Network Programming_Tcplistener - Fatal编程技术网

C# 从网络流异步读取时出错

C# 从网络流异步读取时出错,c#,network-programming,tcplistener,C#,Network Programming,Tcplistener,我已经做了一个应用程序与IP摄像头通信。配置为在预定义地址上建立连接的。TCP侦听器正在该地址上运行,并接受来自摄像机的连接。当相机连接时,我发送命令从相机获取MJpeg流,相机开始响应命令发送流 我正在使用异步方法从套接字读取流。但过了一段时间,我的应用程序在从网络流读取数据时被卡住了 我用这个代码从网络流中读取数据,我在屏幕上写了一些消息来获取摄像头连接的状态 private void ReadData() { try {

我已经做了一个应用程序与IP摄像头通信。配置为在预定义地址上建立连接的。TCP侦听器正在该地址上运行,并接受来自摄像机的连接。当相机连接时,我发送命令从相机获取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方法。
希望这有帮助。

首先,网络流上的异步方法以丢失数据或从不返回数据而闻名! 在您的情况下,可能是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”)