网络流没有响应
Networkstream not responding
我正在尝试通过网络流发送图像这是我的客户端代码:
private void Form1_Load(object sender, EventArgs e)
{
TcpClient client=new TcpClient();
client.Connect("127.0.0.1", 10);
NetworkStream ns = client.GetStream();
Bitmap screen = GetDesktopImage();//generate a screenshot.
MemoryStream ms = new MemoryStream();
screen.Save(ms, ImageFormat.Png);
byte[] byteCount = BitConverter.GetBytes((int)ms.Length);
ms.Position = 0;
ns.Write(byteCount, 0, byteCount.Length);
ms.CopyTo(ns);
ms.SetLength(0);
}
这是服务器:
private void Start()
{
TcpListener listen = new TcpListener(IPAddress.Any, 10);
listen.Start();
NetworkStream ns = new NetworkStream(listen.AcceptTcpClient().Client);
byte[] temp = new byte[4];
ns.Read(temp, 0, 4);
int count = BitConverter.ToInt32(temp, 0);
byte[] buff = new byte[count];
pictureBox1.Image = Image.FromStream(ns);
}
private void Form1_Load(object sender, EventArgs e)
{
Thread th = new Thread(Start);
th.Start();
}
我在图片框上什么也没看到,我想程序挂在这里 - pictureBox1.Image = Image.FromStream(ns);
只是在那里添加了一个断点,但它不起作用。
**只有当我关闭客户端程序并停止调试时,我才能在服务器端的图片框中看到图像。
为什么会这样?有什么想法吗?
我的猜测是 Image.FromStream
绘制完整图像后不知道停止阅读。也许 PNG 格式甚至不允许这样做。您需要向 Image.FromStream
提供大小有限的流。最简单的方法是使用 BinaryReader.ReadBytes(count)
来读取所需的确切字节数。
ns.Read(temp, 0, 4);
:这是一个错误,因为它假定读取将 return 正好是 4 个字节。情况可能并非如此。同样,使用 BinaryReader.ReadInt32
来安全地读取一个 int。
更好的是,放弃自定义序列化格式并使用诸如 protobuf 长度前缀之类的东西。或者,HTTP 或 WCF。
我正在尝试通过网络流发送图像这是我的客户端代码:
private void Form1_Load(object sender, EventArgs e)
{
TcpClient client=new TcpClient();
client.Connect("127.0.0.1", 10);
NetworkStream ns = client.GetStream();
Bitmap screen = GetDesktopImage();//generate a screenshot.
MemoryStream ms = new MemoryStream();
screen.Save(ms, ImageFormat.Png);
byte[] byteCount = BitConverter.GetBytes((int)ms.Length);
ms.Position = 0;
ns.Write(byteCount, 0, byteCount.Length);
ms.CopyTo(ns);
ms.SetLength(0);
}
这是服务器:
private void Start()
{
TcpListener listen = new TcpListener(IPAddress.Any, 10);
listen.Start();
NetworkStream ns = new NetworkStream(listen.AcceptTcpClient().Client);
byte[] temp = new byte[4];
ns.Read(temp, 0, 4);
int count = BitConverter.ToInt32(temp, 0);
byte[] buff = new byte[count];
pictureBox1.Image = Image.FromStream(ns);
}
private void Form1_Load(object sender, EventArgs e)
{
Thread th = new Thread(Start);
th.Start();
}
我在图片框上什么也没看到,我想程序挂在这里 - pictureBox1.Image = Image.FromStream(ns);
只是在那里添加了一个断点,但它不起作用。
**只有当我关闭客户端程序并停止调试时,我才能在服务器端的图片框中看到图像。
为什么会这样?有什么想法吗?
我的猜测是 Image.FromStream
绘制完整图像后不知道停止阅读。也许 PNG 格式甚至不允许这样做。您需要向 Image.FromStream
提供大小有限的流。最简单的方法是使用 BinaryReader.ReadBytes(count)
来读取所需的确切字节数。
ns.Read(temp, 0, 4);
:这是一个错误,因为它假定读取将 return 正好是 4 个字节。情况可能并非如此。同样,使用 BinaryReader.ReadInt32
来安全地读取一个 int。
更好的是,放弃自定义序列化格式并使用诸如 protobuf 长度前缀之类的东西。或者,HTTP 或 WCF。