C# 通过网络流发送多个映像

C# 通过网络流发送多个映像,c#,network-programming,C#,Network Programming,我在通过网络流发送多个图像时遇到问题。我的代码试图在服务器等待命令发送映像时保持与服务器的连接 客户端代码: 例外情况: System.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:不允许在未连接的套接字上执行此操作 使现代化 我增加了客户端在服务器尝试接收图像之前发送图像大小的功能。图像现在已经有些损坏了 更新的客户端代码: 更新的服务器代码: 图片: 你从哪里得到例外?在服务器还是客户端?哪种手术?您试图在调试器中运行以捕获异常

我在通过网络流发送多个图像时遇到问题。我的代码试图在服务器等待命令发送映像时保持与服务器的连接

客户端代码:

例外情况:

System.dll中发生类型为“System.InvalidOperationException”的未处理异常

附加信息:不允许在未连接的套接字上执行此操作

使现代化 我增加了客户端在服务器尝试接收图像之前发送图像大小的功能。图像现在已经有些损坏了

更新的客户端代码:

更新的服务器代码:

图片:


你从哪里得到例外?在服务器还是客户端?哪种手术?您试图在调试器中运行以捕获异常?异常在客户端中引发,将编辑问题以显示位置当服务器断开连接而不说再见时,将发生这种情况。通过只调用一次GetStream来改进程序,将其移出循环。并添加一个bye命令,以便客户端知道停止读取。注意,如果服务器因任何其他原因断开连接,Read方法仍可能失败。注意:不需要添加bye命令。表示希望关闭连接的正确方法是调用Socket.Shutdown,传递SocketShutdown.Send以启动关闭或SocketShutdown。当然,这两种方法都是在发送任何剩余的数据后确认关闭。
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);
}
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);
}