TCP не является системой "byte [] in same byte [] out". Вы можете разделить запись на несколько операций чтения или даже объединить несколько записей в одно чтение.
Что вам нужно сделать, так это внедрить Message Framing в ваш код. Это означает, что вам нужно отправить дополнительные данные, которые ваша принимающая сторона понимает, чтобы знать, сколько данных было отправлено в одном «сообщении».
Вот очень простой пример, когда длина передается перед изображением, тогда другая сторона читает длину, а затем читает это число байтов.
Код клиента
using(TcpClient client = new TcpClient())
{
client.Connect(IPAddress.Parse("123.456.789.123"), 12345);
using (var clientStream = client.GetStream())
{
int imageLength = reader.ReadInt32();
byte[] imagebyte = new byte[imageLength);
int readBytes = 0;
while (readBytes < imageLength)
{
int nextReadSize = Math.Min(client.Available, imageLength - readBytes);
readBytes += await clientStream.ReadAsync(imagebyte, readBytes, nextReadSize);
}
File.WriteAllBytes("Screenshot.png",imageByte);
}
}
Код сервера
TcpListener server = new TcpListener(IPAddress.Any,12345);
using(TcpClient client = await server.AcceptTcpClientAsync())
{
byte[] imagebyte = File.ReadAllBytes("ImageCaptured.temp");
using(BinaryWriter writer = new BinaryWriter(client.GetStream()))
{
writer.Write(imagebyte.Length)
writer.Write(imagebyte, 0, imagebyte.Length);
}
File.Delete("ImageCaptured.temp");
}
Примечание для клиента: если вы не планируете закрывать TcpClient и отправлять больше данных, вам необходимо заменить using(BinaryWriter writer = new BinaryWriter(client.GetStream()))
на using(BinaryWriter writer = new BinaryWriter(client.GetStream(), Encoding.UTF8, true))