为了开发应用程序远程桌面WP7,我开始使用桌面简单查看器并且它可以工作,但问题是没有显示我在服务器端执行的所有操作,这是YouTube中的视频可以向您显示我的问题 http://www.youtube.com/watch?v=3q-FumfYsPQ&feature=youtu.be
我使用套接字连接,我对数据(图像)进行解码和编码。
这是我在WP7客户端的代码
void Conncet(string IP_Address)
{
client_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs()
{
RemoteEndPoint = new IPEndPoint(IPAddress.Parse(IP_Address), 4532)
};
socketEventArg.Completed += OnConncetCompleted;
client_socket.ConnectAsync(socketEventArg);
}
void StartReceiving()
{
byte[] response = new byte[131072];
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.Completed += OnReceiveCompleted;
socketEventArg.SetBuffer(response, 0, response.Length);
client_socket.ReceiveAsync(socketEventArg);
}
private void ViewReceivedImage(byte[] buffer)
{
try
{
MemoryStream ms = new MemoryStream(buffer);
BitmapImage bi = new BitmapImage();
bi.SetSource(ms);
MyImage.Source = bi;
ms.Close();
}
catch (Exception) { }
finally
{
StartReceiving();
}
}
这是我在服务器端(PC)发送图像的代码。
void StartSending()
{
while (!stop)
try
{
Image oldimage = scr.Get_Resized_Image(wToCompare, hToCompare, scr.GetDesktopBitmapBytes());
//Thread.Sleep(1);
Image newimage = scr.Get_Resized_Image(wToCompare, hToCompare, scr.GetDesktopBitmapBytes());
byte[] buffer = scr.GetDesktop_ResizedBytes(wToSend, hToSend);
float difference = scr.difference(newimage, oldimage);
if (difference >= 1)
{
SenderSocket.Send(buffer);
}
}
catch (Exception) { }
}
我的问题是如何快速发送和接收以在+/-实时显示WP7中的PC屏幕。
答案 0 :(得分:0)
你必须找到瓶颈和速度。可能是网络运行速度不够快。使用压缩可能就是答案。
可能是WP7机器不够快,无法显示图像。发送部分屏幕图像或降低分辨率可能是一种解决方案。
可能是Windows机器根本没有足够快地抓取图像。查找一些代码可能是解决方案。使用部分更新也可以提供帮助。
我会寻求一个解决方案,每次更新我只会发送一个角(左上角,右上角,左下角,右下角),因此整个堆栈必须发送/接收较小的数据块。
请注意,模拟器可能会添加/删除一些开销并显示非实际性能。所以不要优化模拟器的代码(太多)
答案 1 :(得分:0)
我猜你的带宽不足了。
如果你问我带宽方面的话,发送完整的未压缩图像是一个可怕的想法。单个RGB32,800x480图像的大小约为1.15兆,因此要维持15个FPS,您需要138 Mbit/s连接。
我建议,在服务器端,只发送已更改的矩形,然后将它们压缩。已经执行此操作的一个协议是RFB protocol,最常用于VNC。