【问题标题】:Convert Bitmap to Array and send the Array via Networkstream将位图转换为数组并通过网络流发送数组
【发布时间】:2017-04-21 21:50:35
【问题描述】:

我的代码有问题。这是一个聊天程序,您可以在其中从另一台 PC 截取屏幕截图。我得到了下面的代码。但是如果我运行代码,屏幕截图看起来像this。问题是我没有收到图像的所有字节(截断)。客户端(发送方)和服务器(接收方)肯定有问题。


代码:

客户:(发送)

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

服务器:(接收方)

 Console.WriteLine("");
                            
                            TcpListener tcpServerListener = new TcpListener(IPAddress.Any, 2000);
                            tcpServerListener.Start();
                        try
                        {
                            Socket serverSocket = tcpServerListener.AcceptSocket();

                            NetworkStream serverSocketStream = new NetworkStream(serverSocket);


                            Console.WriteLine("SERVER");
                            tcpServerListener.Start();



                            Console.WriteLine("[connected to client]");
                            
                            byte[] byt = new byte[1024];
                            Console.WriteLine("-");
                            serverSocketStream.Read(byt, 0, 1024);



                            Console.WriteLine("[-]");
                            Console.WriteLine("write bytes");
                            File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt);
                        } catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                            tcpServerListener.Stop();
                        do
                        {
                           

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example
  • 嘿,我告诉过你我收到的图片不是完整的。
  • @jakob 你有一个正确的答案。单击 标记为解决方案,谢谢。

标签: c# arrays networking bitmap byte


【解决方案1】:

编辑:


我找到了解决“指定参数超出有效值范围。”问题的方法。试试这个!

                    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 个字节。您可以通过先发送文件大小,然后发送图片来解决此问题。看看这个:

要发送的正确代码:(未获批准)

                    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
                    clientSockStream.Write(Encoding.ASCII.GetBytes(bmp.Length), 0, Encoding.ASCII.GetBytes(bmp.Length).Length);


                   // Send the file:
                 
                   clientSockStream.Write(bmp, 0, bmp.Length);
                   

要接收的正确代码:(未获批准)

                   byte[] byt = new byte[1024];
                   serverSocketStream.Read(byt, 0, 1024); // Get the file size

                   byte[] byt_2 = new byte[byt.Length+300];
                   serverSocketStream.Read(byt, 0, byt_2.Length); // Get The File

                   File.WriteAllBytes(@"c:\users\jakob\desktop\bild1.jpg", byt_2);

这段代码我没有测试过,如果有错误可以在评论中提问,我会努力改正的!

【讨论】:

  • 我从@Adola 测试了代码,出现问题“无法将 int 转换为 char[]”
  • 我有另一个解决方案。
  • 你在上面的代码中使用的目录是什么?
  • @jakob 使用系统;使用 System.Net;使用 System.Net.Sockets;使用 System.IO;使用 System,Text ---- 这就是你要问的吗?
  • clientSockStream.Write(Encoding.ASCII.GetBytes(bmp.Length), 0, Encoding.ASCII.GetBytes(bmp.Length).Length);每次我试图运行这段代码时,这条线都不起作用
【解决方案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);

【讨论】:

  • 您可以通过单击“v”符号将我的帖子标记为答案:)
【解决方案3】:

我解决了我遇到的来自adola的代码的问题

发送:

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

                                b.Save(ms, ImageFormat.Png);
                                byte[] bmp = ms.ToArray();
                                string kl = Convert.ToString(bmp);

                                // Send the file size
                                Char[] ch = new Char[bmp.Length]; //added
                                clientSockStream.Write(Encoding.ASCII.GetBytes(ch), 0,Encoding.ASCII.GetByteCount(ch));


                                // Send the file:

                                clientSockStream.Write(bmp, 0, bmp.Length);

但现在此代码 sas “指定的参数超出了有效值的范围。” 谁能告诉我问题出在哪里?

接收:

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

【讨论】:

  • 我更改并编辑了我的答案,再看一遍。我发布了一个新的解决方案!
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多