【问题标题】:Trouble with image transferring over TCP sockets in C#在 C# 中通过 TCP 套接字传输图像的问题
【发布时间】:2012-09-07 21:41:38
【问题描述】:

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

嗯,结果在客户端看起来很酷,但是我在服务器端得到的图片是扭曲的:

右图是客户端(存屏发给服务器), 服务器端在左侧。 如您在服务器端看到的,图片未满。

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

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 { }
    }
}

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

【问题讨论】:

  • 您没有粘贴任何发送或接收代码。另外,你的协议是如何工作的?接收者应该如何知道它何时收到了整个图像?
  • 你的权利,我已经添加了这些代码。我用'while(true)'循环发送图像,与接收器相同。
  • 请直接在本站发布您的代码,我已经更新了您的帖子。
  • 对了,sendBytes = BmpToBytes(getScreen()); 会丢弃你在byte[] sendBytes = new byte[12500]; 中创建的数组。所以你可以删除那行代码。

标签: c# image sockets tcp bitmap


【解决方案1】:

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

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

编辑

检查networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize) 返回的内容。大概不到12500。

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

【讨论】:

  • 代码现在在那里,你是对的。我会说很好的猜测,但这也是我想到的第一件事。
  • 那么,我必须知道要读取多少字节才能获得正确的图像?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多