C# 将位图转换为数组并通过Networkstream发送数组
我的代码有问题。这是一个聊天程序,你可以从另一台电脑截图。我得到下面的代码。但是如果我运行代码,屏幕截图是这样的。问题是我没有收到图像的所有字节(被截断)。客户端(发送方)和服务器(接收方)一定有问题C# 将位图转换为数组并通过Networkstream发送数组,c#,arrays,networking,bitmap,byte,C#,Arrays,Networking,Bitmap,Byte,我的代码有问题。这是一个聊天程序,你可以从另一台电脑截图。我得到下面的代码。但是如果我运行代码,屏幕截图是这样的。问题是我没有收到图像的所有字节(被截断)。客户端(发送方)和服务器(接收方)一定有问题 代码: 客户端:(发送): string ip = "192.168.98.78"; Bitmap b = new Bitmap(SystemInformation.Virtual
代码: 客户端:(发送):
string ip = "192.168.98.78";
Bitmap b = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
Graphics g = Graphics.FromImage(b);
Console.WriteLine("taking screenshot");
g.CopyFromScreen(0, 0, 0, 0, b.Size);
g.Dispose();
MemoryStream ms = new MemoryStream();
b.Save(ms, ImageFormat.Png);
byte[] bmp = ms.ToArray();
Console.WriteLine("sending pic");
do {
try
{
TcpClient tcpClient = new TcpClient(ip, 2000);
NetworkStream clientSockStream = tcpClient.GetStream();
Console.WriteLine("connecting to server");
StreamWriter clientStreamWriter = new StreamWriter(clientSockStream);
Console.WriteLine("send data");
clientSockStream.Write(bmp, 0, 1024);
tcpClient.Close();
fertig = true;
} catch (Exception h)
{
Console.WriteLine(h.Message);
}
} while (fertig != true);
服务器:(接收器)
编辑:
我找到了“指定参数超出有效值范围”的解决方案。试试这个
serverSocketStream.Read(byt, 0, 1024); // Get the file size
byte[] byt_2 = new byte[Convert.ToInt32(System.Text.Encoding.UTF8.GetString(byt)) + 300];
Console.WriteLine("-");
serverSocketStream.Read(byt_2, 0, byt_2.Length); // Get The File
Console.WriteLine("-");
Console.WriteLine("write bytes");
File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt_2);
您要接收的代码:
byte[] byt = new byte[1024];
Console.WriteLine("-");
serverSocketStream.Read(byt, 0, 1024);
您决定通过存储在能够容纳1024字节的字节数组中来读取图像。您将需要超过1024字节,因为您尝试发送的图像超过1024字节。您可以通过先发送文件大小,然后再发送图片来解决此问题。看看这个:
要发送的正确代码:(不批准)
要接收的正确代码:(不批准)
我还没有测试这段代码,但是如果您有任何错误,您可以在注释中询问,我将尝试修复它 我用adola的代码解决了这个问题 发送: 但现在,这段代码显示“指定的参数超出了有效值的范围。” 谁能告诉我问题出在哪里吗 收到:
serverSocketStream.Read(byt, 0, 1024); // Get the file size
byte[] byt_2 = new byte[byt.Length + 300];
Console.WriteLine("-");
serverSocketStream.Read(byt, 0, byt_2.Length); // Get The File
Console.WriteLine("-");
Console.WriteLine("write bytes");
File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt_2);
Socket serverSocket = tcpServerListener.AcceptSocket();
NetworkStream serverSocketStream = new NetworkStream(serverSocket);
Console.WriteLine("SERVER");
tcpServerListener.Start();
Console.WriteLine("[connected to client]");
byte[] byt = new byte[1024];
//get size Lenght
int Lenght = Convert.ToInt32(sr.ReadLine());
byte[] byt_2 = new byte[Lenght + 3000];
Console.WriteLine("-");
// Get The File
serverSocketStream.Read(byt_2, 0, byt_2.Length);
Console.WriteLine("-");
Console.WriteLine("write bytes");
//write bytes in the file
File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt_2);
我解决了问题
发送:
收到:
serverSocketStream.Read(byt, 0, 1024); // Get the file size
byte[] byt_2 = new byte[byt.Length + 300];
Console.WriteLine("-");
serverSocketStream.Read(byt, 0, byt_2.Length); // Get The File
Console.WriteLine("-");
Console.WriteLine("write bytes");
File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt_2);
Socket serverSocket = tcpServerListener.AcceptSocket();
NetworkStream serverSocketStream = new NetworkStream(serverSocket);
Console.WriteLine("SERVER");
tcpServerListener.Start();
Console.WriteLine("[connected to client]");
byte[] byt = new byte[1024];
//get size Lenght
int Lenght = Convert.ToInt32(sr.ReadLine());
byte[] byt_2 = new byte[Lenght + 3000];
Console.WriteLine("-");
// Get The File
serverSocketStream.Read(byt_2, 0, byt_2.Length);
Console.WriteLine("-");
Console.WriteLine("write bytes");
//write bytes in the file
File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt_2);
我投票结束这个问题,因为寻求调试帮助的问题(“为什么这个代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。看:。嘿,我告诉过你我收到的照片不是完整的。@jakob你回答得对。单击
✔代码>谢谢。我测试了@Adola的代码。有一个问题“无法将int转换为char[]”我有另一个解决方案。你在上面的代码中使用的目录是什么?@jakob使用系统;Net系统;使用System.Net.Sockets;使用System.IO;使用System,Text----这就是您要问的吗?clientSockStream.Write(Encoding.ASCII.GetBytes(bmp.Length),0,Encoding.ASCII.GetBytes(bmp.Length.Length);这一行不工作,每次我试图运行这个代码我改变和编辑我的答案,再看看它。我发布了一个新的解决方案!您可以单击“v”符号将我的帖子标记为答案:)
serverSocketStream.Read(byt, 0, 1024); // Get the file size
byte[] byt_2 = new byte[byt.Length + 300];
Console.WriteLine("-");
serverSocketStream.Read(byt, 0, byt_2.Length); // Get The File
Console.WriteLine("-");
Console.WriteLine("write bytes");
File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt_2);
TcpClient tcpClient = new TcpClient(ip, 2000);
NetworkStream clientSockStream = tcpClient.GetStream();
Console.WriteLine("connecting to server");
StreamWriter clientStreamWriter = new StreamWriter(clientSockStream);
Console.WriteLine("send data");
//-
Bitmap b = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
Graphics g = Graphics.FromImage(b);
Console.WriteLine("taking screenshot");
g.CopyFromScreen(0, 0, 0, 0, b.Size);
g.Dispose();
MemoryStream ms = new MemoryStream();
b.Save(ms, ImageFormat.Png);
byte[] bmp = ms.ToArray();
// Send the file size
sw.WriteLine(bmp.Length);
// Send the file
clientSockStream.Write(bmp, 0, bmp.Length);
//-
tcpClient.Close();
Socket serverSocket = tcpServerListener.AcceptSocket();
NetworkStream serverSocketStream = new NetworkStream(serverSocket);
Console.WriteLine("SERVER");
tcpServerListener.Start();
Console.WriteLine("[connected to client]");
byte[] byt = new byte[1024];
//get size Lenght
int Lenght = Convert.ToInt32(sr.ReadLine());
byte[] byt_2 = new byte[Lenght + 3000];
Console.WriteLine("-");
// Get The File
serverSocketStream.Read(byt_2, 0, byt_2.Length);
Console.WriteLine("-");
Console.WriteLine("write bytes");
//write bytes in the file
File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt_2);