通过NetworkStream发送Multipe图像

时间:2015-11-25 07:03:41

标签: c# network-programming

我在NetworkStream上发送多张图片时遇到问题。我的代码在等待命令发送图像时尝试与服务器保持连接。

客户代码:

TcpClient client = new TcpClient();
client.Connect(HOSTNAME, PORT);

while (true)
{
    NetworkStream stream = client.GetStream(); // <-- Exception thrown here

    WaitCmd(stream, "deskcap"); // Waits until the command "deskcap" is received from the server

    Bitmap capture = CaptureDesktop();
    MemoryStream ms = new MemoryStream();
    capture.Save(ms, ImageFormat.Jpeg);

    byte[] imageBuffer = ms.GetBuffer();
    stream.Write(imageBuffer, 0, (int)ms.Length);
    stream.Close();
}

服务器代码:

private void desktopButton_Click(object sender, EventArgs e)
{
    TcpItem c = (TcpItem)clientsComboBox.SelectedItem;
    NetworkStream stream = c.client.GetStream();
    string cmd = "deskcap";
    byte[] buffer = Encoding.Default.GetBytes(cmd);
    stream.Write(buffer, 0, buffer.Length);
    Image img = Image.FromStream(stream);
    img.Save(@"C:\Users\" + username + @"\Captures\capture" + DateTime.Now.ToBinary() + ".jpg", ImageFormat.Jpeg);
}

例外:

  

未处理的类型&#39; System.InvalidOperationException&#39;发生在System.dll

中      

附加信息:非连接套接字上不允许进行操作。

更新

我添加了客户端在服务器尝试接收之前发送图像大小的功能。图像现在已经有点破坏了。

更新了客户端代码:

TcpClient client = new TcpClient();
client.Connect(HOSTNAME, PORT);
NetworkStream stream = client.GetStream();

while (true)
{
    WaitCmd(stream, "deskcap"); // Waits until the command "deskcap" is received from the server

    Bitmap capture = CaptureDesktop();
    MemoryStream ms = new MemoryStream();
    capture.Save(ms, ImageFormat.Jpeg);
    byte[] imageArr = ms.ToArray();

    byte[] sizeHeader = BitConverter.GetBytes(imageArr.Length);
    stream.Write(sizeHeader, 0, sizeHeader.Length); // Should always write four bytes
    stream.Write(imageArr, 0, imageArr.Length);
}
stream.Close();

更新了服务器代码:

private void desktopButton_Click(object sender, EventArgs e)
{
    TcpItem c = (TcpItem)clientsComboBox.SelectedItem;
    NetworkStream stream = c.client.GetStream();

    string cmd = "deskcap";
    byte[] cmdBuffer = Encoding.Default.GetBytes(cmd);
    stream.Write(cmdBuffer, 0, cmdBuffer.Length);

    byte[] sizeBuffer = new byte[4];
    stream.Read(sizeBuffer, 0, 4); // Read a four byte header that contains the size of the image
    uint size = BitConverter.ToUInt32(sizeBuffer, 0);

    byte[] imageBuffer = new byte[size];
    stream.Read(imageBuffer, 0, (int)size);
    MemoryStream ms = new MemoryStream(imageBuffer);
    Image img = Image.FromStream(ms);
    img.Save(@"C:\Users\" + username + @"\Captures\capture" + DateTime.Now.ToBinary() + ".jpg", ImageFormat.Jpeg);
}

图片:

enter image description here

0 个答案:

没有答案