需求电脑端桌面需要投屏到其他设备可能是电脑或者手机端,相反电脑端也要接收其他设备投屏过来的,这样就要做客户端和服务端 两个项目 来调试运行
需求明确搜集相关技术资料, 主要涉及到的有socket udpClient ,windows 截屏,图片压缩
(一)点对点传输方式
使用socket 实现点对点发送基于tcp 传输方式。
服务端
创建socket套接字
开启线程循环发送图片
socket有sendTo () 和send()方法,
send ();是指定的EndPoint 的终结点 , 因为 已经有Connect()方法已经连接到的终结点了ip 有了指定的发送地址所以此处调用了send();
sendTo() 使用UDP进行通信时,不需要连接。因为异地的主机之间没有建立连接,所以UDP不能使用标准的Send()和Receive()套接字方法,而是使用两个其他的方法:SendTo(byte[] data , EndPoint Remote) ,SendTo()方法指定要发送的数据,和目标机器的IPEndPoint .
recive() 方法和reciveFrom 和send 的方法用法相似。
发送图片
服务端实现思路就这样,截屏和处理图片略 网上一大堆
客户端
创建socket 连接 调用
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
ep = iep as EndPoint;
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe); // 绑定远程电脑发过来终结点
s.Listen(10); Socket temp = s.Accept(); //socket 监听
创建线程略
执行读取方法 注意 ,如果有数据丢失 ,修改缓冲区大小,
广播模式, 一对多屏幕传输, ,
服务端 (广播)
socket 广播
socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);
广播消息的目的IP地址是一种特殊IP地址,称为广播地址。 广播地址由IP地址网络前缀加上全1主机后缀组成,如:192.168.1.255是192.169.1.0这个网络的广播地址;130.168.255.255是130.168.0.0这个网络的广播地址。向全部为1的IP地址(255.255.255.255)发送消息的话,那么理论上全世界所有的联网的计算机都能收得到了。但实际上不是这样的,一般路由器上设置抛弃这样的包,只在本地网内广播,所以效果和向本地网的广播地址发送消息是一样的。 通常EndPoint Remote = new IPEndPoint(IPAddress.Broadcast,9050)
/*
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9040);//初始化一个发送广播和指定端口的网络端口实例
ep = iep as EndPoint;
sock .SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); */
udp 广播 设置简单, 只要配置好IP和IPEndPoint
newClient = new UdpClient(new IPEndPoint(IPAddress.Any, 0));
remote = new IPEndPoint(IPAddress.Broadcast, 7788);
设置完启用线程循环发送桌面截屏 的方法和点对点发送图片方法一样。
客户端 实现简单如下,
在调试过程中出现各种问题, 客户端接收截屏 一直显示是半行,图片其他都没有显示出来, 找了半天, 尝试各种办法, 看到有人说是缓冲区太小, udp包 传输 大小有限制, window 下默认8k。调整了发送截屏方法里的缓冲区大小。这样就显示出来。 侥幸对图片进行处理, 图片不会太大,要不就要分包来处理。
屏幕传输网上还有一种方式 使用timer 定时的执行截屏方法, 这样行的通, 就是出来的屏幕不流畅 。
由于项目需求简单, 就做的简单。初识socket和 udp 走了不少弯路。
网友评论