2

我要做的是将客户端屏幕的图像传输到服务器。为此,在客户端,我获取屏幕图像,将其转换为字节数组并通过 TCP 套接字将字节数组发送到服务器。在服务器端,我将客户端的字节数组转换为图像并将其放入图片框中。

好吧,结果在客户端看起来很酷,但是我在服务器端得到的图片是扭曲的: http://i.stack.imgur.com/wsLNh.png

右图是客户端(保存画面并发送给服务器),左边是服务器端。正如您在服务器端看到的那样,图片未满。

我正在使用这些代码发送图像,接收图像并转换(字节>图像||图像>字节):

private Image getScreen()
{
    Size s = Screen.PrimaryScreen.Bounds.Size;
    Bitmap b = new Bitmap(s.Height, s.Width);
    Graphics g = Graphics.FromImage(b);
    g.CopyFromScreen(0, 0, 0, 0, s);

    return b;
}

private byte[] BmpToBytes(Image bmp)
{
    MemoryStream ms = new MemoryStream();
    bmp.Save(ms, ImageFormat.Jpeg);
    byte[] bmpBytes = ms.GetBuffer();
    bmp.Dispose();
    ms.Close();

    return bmpBytes;
}

private Image BytesToImg(byte[] bmpBytes)
{
    MemoryStream ms = new MemoryStream(bmpBytes);
    Image img = Image.FromStream(ms);
    return img;
}


Client side:
private void SendScreenToServer()
{
    while (true)
    {
        byte[] sendBytes = new byte[12500];
        sendBytes = BmpToBytes(getScreen());
        pictureBox1.Image = getScreen();
        serverStream.Write(sendBytes, 0, sendBytes.Length);
        serverStream.Flush();
    }
}

Server side:
private void GetScreenFromClient()
{
    while (true)
    {
        byte[] bytesFrom = new byte[12500];
        networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);

        try
        {
            pictureBox1.Image = BytesToImg(bytesFrom);
        }
        catch { }
    }
}

有人知道我在做什么错吗?还是有任何其他选项可以通过套接字传输图像?

4

3 回答 3

2

我会盲目猜测,因为您没有向我们展示您用于传输图像的代码。

stream.Read(buffer,start,length)不保证你会得到length字节,而不是溢出缓冲区是上限。您应该检查给出读取字节数的返回值。

编辑

检查networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize)返回的内容。它可能小于12500。

您可能还需要在发送图像之前发送图像的大小,以便能够准确地知道要从流中读取多少字节。

于 2012-09-14T17:45:48.767 回答
1

你忘了设计和实现一个协议。

    networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);

这从 TCP 数据连接接收一堆字节。接下来你要做的就是根据你的协议处理这些字节。

接收者应该如何知道它何时收到了整个图像?您必须决定如何进行编码。

于 2012-09-14T17:48:01.970 回答
0

如果您每次通过网络传输整个图像而不是第一次发送整个图像并且从下一次您应该只将先前图像和当前图像之间的差异发送到服务器并且在服务器端您只是应用,那将是一个坏主意当前图像上的差异。您可以搜索谷歌以获得通过网络发送图像之间差异的良好逻辑,并将差异应用于服务器端的当前图像。谢谢

于 2012-12-06T07:31:58.173 回答