在单字节数组(通过TCP)C#中发送多个图像的简便方法?

时间:2013-12-17 15:37:34

标签: c# arrays sockets tcp

问题在于:我已经成功设置了一个应用程序,可以从手机中提取单个视频帧并将其移动到服务器。但是如您所知,固有延迟不允许在服务器端平滑过渡。我猜我需要在单个字节数组中打包一些图像并在服务器端解压缩它们。但有一个干净/简单的方法来做到这一点?我可以使用多维数组吗?还有别的吗?

这是我的客户端(有效负载是转换为单字节数组的传入图像):

if (_socket != null)
        {
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();

            socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
            socketEventArg.UserToken = null;

            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                response = e.SocketError.ToString();

                // Unblock the UI thread
                _clientDone.Set();
            });


            socketEventArg.SetBuffer(payload, 0, payload.Length);
            _clientDone.Reset();

            _socket.SendAsync(socketEventArg);                
            _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }

这就是我在服务器端所做的事情:

        const int portNo = portNumber;

        TcpListener listener = new TcpListener(portNo);
        listener.Start();
        Console.WriteLine("Listening...");

        TcpClient tcpClient = listener.AcceptTcpClient();
        NetworkStream NWStream = tcpClient.GetStream();
        byte[] bytesToRead = new byte[tcpClient.ReceiveBufferSize + 1];
        FrameCount += 1;


        int numBytesRead = NWStream.Read(bytesToRead, 0, Convert.ToInt32(tcpClient.ReceiveBufferSize));

        string FILE_NAME = "c:\\frames\\" + FrameCount.ToString() + ".gif";
        System.IO.FileStream fs = null;
        fs = new FileStream(FILE_NAME, FileMode.CreateNew, FileAccess.Write);
        fs.Write(bytesToRead, 0, numBytesRead);
        fs.Close();

        tcpClient.Close();
        listener.Stop();

        StartImage();

1 个答案:

答案 0 :(得分:3)

只要您的图像大于tcp包大小(我认为在Windows上默认为1024),您将无法通过在一个发送/接收中发送多个图像来获得性能。

但是,每个套接字连接发送多个图像非常有用,因为您可以避免多次连接握手的开销。

在优化软件包之前,请尝试在同一套接字连接上一个接一个地发送多个映像。