c# - C# Xamarin 使用 TCP 套接字从流字节数组中接收和显示图像
问题描述
我目前正在开发一个项目,我使用套接字从 WinForm应用程序通过 TCP 将图像发送到同一网络中的 Xamarin Android应用程序。
我已经使用客户端(也是 Winforms)测试了服务器( WinForms )代码并管理它工作。但是问题来了,当我在 Xamarin 中为 Android 客户端编写代码时,我发现我不能以同样的方式使用 Bitmap,所以我试图找到其他方式。
问题出在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
});
推荐阅读
- android - Android闪屏背景而不是windowBackground
- vespa - 在 Vespa 中使用 tensorflow 神经模型重新排序
- vb.net - 位置 0 处没有行。IndexOutofRangeException
- vbscript - Windows 7 不会自动刷新文件夹,使用 Sendkey 制作了一个 vbs 脚本来刷新
- c++ - C ++中的增量和三元运算符优先级
- javascript - 更改鼠标悬停时的粒子效果
- css - 使一个 SPAN 适合另一个 SPAN 高度
- reference - 为什么纯函数式语言只允许按值传递参数?
- python - 从数据中找到峰值
- r - 合并具有相同相关值的变量