C#Xamarin接收并显示来自TCP套接字的流字节阵列的图像



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

我已经使用客户端(也称为WinForms(测试了服务器(WinForms(代码,并使其正常工作。但是问题来了,当我在Xamarin中为Android客户端编写代码时,我发现我不能以同样的方式使用位图,所以我试着找到其他方法

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

在Android客户端上:如果我删除while loop并开始播放发送按钮(服务器(和连接按钮(客户端(,则客户端会显示一些图像这很奇怪

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

我使用的代码

WinForms服务器中的代码是这样的。

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

已解决

按照@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

});

最新更新