C# 通过网络流发送多个映像
我在通过网络流发送多个图像时遇到问题。我的代码试图在服务器等待命令发送映像时保持与服务器的连接 客户端代码: 例外情况: System.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:不允许在未连接的套接字上执行此操作 使现代化 我增加了客户端在服务器尝试接收图像之前发送图像大小的功能。图像现在已经有些损坏了 更新的客户端代码: 更新的服务器代码: 图片:C# 通过网络流发送多个映像,c#,network-programming,C#,Network Programming,我在通过网络流发送多个图像时遇到问题。我的代码试图在服务器等待命令发送映像时保持与服务器的连接 客户端代码: 例外情况: 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);
}