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);