我使用此代码截取屏幕截图 - 将其转换为字节 - 将其发送到我的客户端 但是当客户收到它时它就变成了一半。
以下是代码,它将屏幕截图转换为字节,然后将其发送到我的客户端代码:
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[10000*10000*10];
bmpScreenShot = ResizeBitmap(bmpScreenShot, 300, 300);
image = ImageToByte(bmpScreenShot);
sck.Send(image, 0, image.Length, 0);
}
这是接收代码
public void ReceiveImage()
{
if (sck.Connected)
{
{
NetworkStream stream = new NetworkStream(sck);
byte[] data = new byte[10000 * 10000 * 3];
string receive = string.Empty;
Int32 bytes = stream.Read(data, 0, data.Length);
pictureBox1.Image = byteArrayToImage(data);
}
}
}
答案 0 :(得分:2)
您正在发送1000 * 1000 * 10个字节,并且您正在接收1000 * 1000 * 3个字节。
另外,只要有更多内容,请确保您从流中读取。
更安全的方法是首先发送数组的大小。
因此,在将图像转换为JPG后,获取字节数,以4个字节发送此数量,读取这4个字节,准备该大小的缓冲区并读取流。
更多提示
image = ImageToByte(bmpScreenShot);
// get the encoded image size in bytes
int numberOfBytes = image.Length;
// put the size into an array
byte[] numberOfBytesArray = BitConverter.GetBytes(numberOfBytes);
// send the image size to the server
sck.Send(numberOfBytesArray, 0, numberOfBytesArray.Length, 0);
// send the image to the server
sck.Send(image, 0, numberOfBytes, 0);
服务器
NetworkStream stream = new NetworkStream(sck);
byte[] data = new byte[4];
// read the size
stream.Read(data, 0, data.Length);
int size = BitConverter.ToInt32(data);
// prepare buffer
data = new byte[size];
// load image
stream.Read(data, 0, data.Length);
答案 1 :(得分:2)
首先,此代码已损坏:
byte[] data = new byte[10000 * 10000 * 3];
Int32 bytes = stream.Read(data, 0, data.Length);
您假设您只需拨打Read
一次即可收到数据。你不能认为 - 这是一个流式协议。您应该循环,直到Read
返回0 ...或者在数据前面加上您要发送的“消息”的长度。
此外,还不清楚ResizeBitmap
或ImageToByte
做了什么,但是当你真的不知道你需要多少字节时,必须预先分配数组是很奇怪的。