发送和接收图像文件C#

时间:2011-07-25 04:23:51

标签: c# .net sockets networking image

我现在一直在努力通过套接字发送图像文件。我相信我非常接近,但我还没有得到它。我正在尝试将图像从服务器发送到客户端。

这是我的服务器代码:

//Init listener
listener = new TcpListener(new IPEndPoint(IPAddress.Any, 550));

//Start listening for connections
listener.Start();
Console.WriteLine("Waiting for connection");
s = listener.AcceptSocket();
//If we reach here, we have a connection
Console.WriteLine("Connected");
//Get the screenshot and apply it to our memory stream
img = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
imgG = Graphics.FromImage(img);
imgG.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
img.Save("sc.jpg", ImageFormat.Jpeg);
//Convert image to byte array, and then send it
byte[] byteArray = ms.ToArray();
s.Send(byteArray);
s.Close();
Console.Read();

这是我的客户代码:

client = new TcpClient();
client.Connect(new IPEndPoint(IPAddress.Parse(IPBox.Text), 550));
s = client.Client;
buffer = new byte[100000];
s.Receive(buffer);
ms.Read(buffer, 0, 100000);
img = (Bitmap)Image.FromStream(ms);
imgContainer.Image = (Image)img;

我觉得我非常接近,但我可能还很远。我是网络新手,请求帮助。非常感谢。

1 个答案:

答案 0 :(得分:2)

问题是在您的客户端中,您假设您从服务器收到了100000个字节,并且您将所有100000个字节放入内存流中。

MSDN页面上有一个很好的示例TcpClient,它显示了使用底层NetworkStream从TcpClient接收。此外,您还需要跟踪实际接收的字节数(这是NetworkStream.Read函数的返回值)。最后,您将继续阅读,直到无法从主机读取更多数据。如果您的图像大于缓冲区,那么您也只会有部分图像。 NetworkStream.Read链接页面上的示例显示在有可用数据的情况下不断从流中读取。