【问题标题】:C# Xamarin Recieve and Display image from Stream Byte Array with TCP SocketsC# Xamarin 使用 TCP 套接字从流字节数组中接收和显示图像
【发布时间】:2023-03-31 14:30:02
【问题描述】:

我目前正在从事一个项目,我通过 TCP 发送图像,使用套接字从 WinForm 应用程序到 Xamarin Android 应用程序同一网络

我已经使用客户端(也称为 Winforms)测试了服务器(WinForms)代码并对其进行了管理。但是问题来了,当我在Xamarin 中为Android 客户端 编写代码时,我发现我不能以同样的方式使用Bitmap,所以我尝试寻找其他方式。

问题出在 android 客户端代码上。我在调试中检查了图像字节从服务器 -> 客户端全部通过

在 Android 客户端上: 如果我删除while loop 并开始使用发送按钮(服务器)和连接按钮(客户端),一些图像会出现在客户端。 这很奇怪

我不是这些问题的专家,所以请随时提出任何更正建议

我使用的代码

我的 WinForms Server 中的代码是这样的。

private void StartServer_Click(object sender, EventArgs e)
     {
         IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 9999);
         Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
         server.Bind(iep);
         server.Listen(100);
         Console.WriteLine("Waiting for client....");
         client = server.Accept();
     }
     private void SendImage_Click(object sender, EventArgs e)
     {
         Bitmap bmp = TakingScreenshotEx1(); // method for taking screenshot
         bmp.Save("1.jpeg", ImageFormat.Jpeg); // the name of the screenshot taken, just before 
    
         byte[] buffer = ReadImageFile("1.jpeg"); // read the saved image file 
         int v = client.Send(buffer, buffer.Length, SocketFlags.None); // send the image 
         Console.WriteLine("Image SENT!");
     }

我的 WinForms 客户端(新手但工作方法)

 IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 9999);
     Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     byte[] buffer = new byte[1000000];
    
     private async void Connect_Click(object sender, EventArgs e)
     {  
        if(client.Connected != true)
         client.Connect(iep);
    
         await Task.Run(() => DoSomethingLong());
     }
    private async void DoSomethingLong()
     {
         while (true)
         {
             int v = client.Receive(buffer, buffer.Length, SocketFlags.None);
             Console.WriteLine("Data Received!");
    
             Stream stream = new MemoryStream(buffer);
             var img = Bitmap.FromStream(stream);
             pictureBox1.Image = img;
         }
     }

有问题的 Android 客户端

     IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 9999);
     Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     byte[] buffer = new byte[1000000];
     private async void Connect_Clicked(object sender, EventArgs e)
     {
         if (client.Connected != true)
             client.Connect(iep);

         await Task.Run(() => DoSomethingLong());
     }
     public Xamarin.Forms.ImageSource PhotoStream { get; set; }
     private async void DoSomethingLong()
     {

         while(true){
             int v = client.Receive(buffer, buffer.Length, SocketFlags.None);
                 Console.WriteLine("Data Received!");
                 Stream stream = new MemoryStream(buffer);
                if (stream != null)
                     imgXam.Source = ImageSource.FromStream(() => stream);
         }
}

【问题讨论】:

  • 在更新 ImageSource 时使用 MainThread - docs.microsoft.com/en-us/xamarin/essentials/main-thread
  • @Jason 感谢您的回复。这显然似乎在做某事。但是如果我把while loop 和里面的代码放在一起。所以它会自动刷新。应用程序冻结(假设循环阻塞了 UI 线程),这是导致我出现这种情况的问题。

标签: c# android xamarin xamarin.forms websocket


【解决方案1】:

已解决

遵循@Jason 的建议并将Invoke Method 放入Timer 中。我能够解决问题

 Device.StartTimer(TimeSpan.FromMilliseconds(500), () =>
        {
            // called every 1 second

            MainThread.BeginInvokeOnMainThread(() =>
            {

            });
            
            return true; // return true to repeat counting, false to stop timer
            
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多