C# 使用tcp套接字发送和接收图像
我用这些代码发送和接收带有TCP套接字的图像,但是接收代码不起作用,希望你能帮助我 这是发送代码C# 使用tcp套接字发送和接收图像,c#,image,tcp,C#,Image,Tcp,我用这些代码发送和接收带有TCP套接字的图像,但是接收代码不起作用,希望你能帮助我 这是发送代码 public void SendImage() { int ScreenWidth = Screen.GetBounds(new Point(0, 0)).Width; int ScreenHeight = Screen.GetBounds(new Point(0, 0)).Height; Bitmap bmpScreenShot = new Bitmap(ScreenWid
public void SendImage()
{
int ScreenWidth = Screen.GetBounds(new Point(0, 0)).Width;
int ScreenHeight = Screen.GetBounds(new Point(0, 0)).Height;
Bitmap bmpScreenShot = new Bitmap(ScreenWidth, ScreenHeight);
Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
gfx.CopyFromScreen(0, 0, 0, 0, new Size(ScreenWidth, ScreenHeight));
bmpScreenShot.Save(Application.StartupPath + "/ScreenShot.jpg", ImageFormat.Jpeg);
byte[] image = new byte[1];
bmpScreenShot = ResizeBitmap(bmpScreenShot, 300, 300);
image = ImageToByte(bmpScreenShot);
//get the length of image (length of bytes)
int NumberOfBytes = image.Length;
//put the size into a byte array
byte[] numberofbytesArray = BitConverter.GetBytes(NumberOfBytes);
//send the size to the Client
int sizesend = sck.Send(numberofbytesArray, 0, numberofbytesArray.Length, 0);
if (sizesend > 0)
{
MessageBox.Show("Size Sent");
}
//send the image to the Client
int imagesend =sck.Send(image, 0, NumberOfBytes, 0);
if (imagesend > 0)
{
MessageBox.Show("Image Sent");
}
}
这是接收代码
public void ReceiveImage()
{
if (sck.Connected)
{
NetworkStream stream = new NetworkStream(sck);
byte[] data = new byte[4];
//Read The Size
stream.Read(data, 0, data.Length);
int size = IPAdress.HostToNetworkOrder(BitConverter.ToInt32(data,0));
// prepare buffer
data = new byte[size];
//Load Image
int read = 0;
while (read != data.Length)
{
read += stream.Read(data, read, data.Length - read);
}
//stream.Read(data, 0, data.Length);
//Convert Image Data To Image
MemoryStream imagestream = new MemoryStream(data);
Bitmap bmp = new Bitmap(imagestream);
pictureBox1.Image = bmp;
}
}
编辑 删除iPAddress.HostToNetwork后,请按以下顺序执行
int size = BitConverter.ToInt32(data,0);
还有一个问题。问题是当我发送大小时,它被发送为5kb,但当我收到它时,我发现它接近2GB
此外,我在这一行得到一个错误
read += stream.Read(data, read, data.Length - read);
带着下面的信息
无法从传输连接读取数据。由于系统缺少足够的缓冲区空间或队列已满,可能会对套接字执行操作
不要使用hosttonetworkorder,除非您正在创建一个应该与java服务器/客户端兼容的服务器。如果这样做,还需要更改正在发送的int数据缓冲区的顺序
您还可以将客户端接收的字节直接写入memorystream,而不是分配数据并将字节写入memorystream。还有一个重要的注意事项,在将其交给位图构造函数之前,不要忘记设置
imagestream.Position=0
。在尝试执行行data=new byte[size]之前,大小值是多少代码>?-1991225785是值,但当我删除IPAddress.HostToNetworkOrder时,它变为正值。您似乎想要相反的地址-IPAddress.NetworkToHostOrder
,否?您是从网络获取的,需要在当前主机上将其作为int。顺便说一句,您不必分配image
,因为您只需在几行之后将其分配给“ImageToByte”的结果。试图分配1000000字节,然后扔掉它似乎是一种浪费……ImageToByte()函数在哪里?这似乎是有缺陷的,返回的字节比需要的多。检查此SO链接,该链接显示如何将图像转换为字节,反之亦然:当我删除它时,出现了此错误“无法从传输连接读取数据”。由于系统缺少足够的缓冲区空间或队列已满,可能会对套接字执行操作`@塔里卡德尔:它“出现”在哪里?当您使用Read
函数遍历代码行时,我之所以这样做是因为当我删除它时,该方法会将一个空字节转换为图像,但当我放置此方法时,它会等待,直到它不=0@TarekAdel:什么方法将空字节转换为图像?什么是空字节?你把什么放在哪里,什么不等于0?你介意详细解释一下你最后的评论吗?@TarekAdel:当你得到你在对这个答案的第一个评论中描述的错误时,当客户转换它时,它的大小有多大?