先谈需求,本demo源于实验室的师兄们找工作的时候,针对有些公司会监视多屏幕的情况,突发奇想自己写了一个小demo来分享屏幕,随手写的使用价值不大~在本机测试效果不错,但是跨机效果很一般,不知道是不是路由器的问题。另没有对接收发送的数据进行校验,只是比较基础的实现。为什么说是局域网,因为数据传输效果太糟糕,理论远程也是可以的,没有试。只贴出了处理代码,界面代码和编译后的结果我上传github了,可以查看

服务器代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
using System.IO;namespace screen_server
{class Server{private string localIP;private Bitmap screenNow;private string[] terminalList;private int listenPort;private int screenHeight;private int screenWidth;private bool isWork;private byte[] buffer;private string errorMessage;private Socket server;public Server(int listenPort){screenWidth  = Screen.PrimaryScreen.Bounds.Width;screenHeight = Screen.PrimaryScreen.Bounds.Height;ScreenNow = new Bitmap(screenWidth, screenHeight);IsWork = false;this.listenPort = listenPort;//获取本地ip地址try{string HostName = Dns.GetHostName(); //得到主机名IPHostEntry IpEntry = Dns.GetHostEntry(HostName);for (int i = 0; i < IpEntry.AddressList.Length; i++){if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork){//限制了实验室网段或者学校内网if (IpEntry.AddressList[i].ToString().Contains("192.168.199") || IpEntry.AddressList[i].ToString().Contains("114.213")){LocalIP = IpEntry.AddressList[i].ToString();break;}}}if (LocalIP == null)LocalIP = "";}catch (Exception ex){errorMessage =  ex.Message;showErrorMessage();}}public string[] TerminalList { get => terminalList; set => terminalList = value; }public string LocalIP { get => localIP; set => localIP = value; }public Bitmap ScreenNow { get => screenNow; set => screenNow = value; }public bool IsWork { get => isWork; set => isWork = value; }public void showErrorMessage(){}public void startService(){server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ip = IPAddress.Parse(LocalIP);server.Bind(new IPEndPoint(ip, listenPort));server.Listen(10);Thread myThread = new Thread(ListenClientConnect);myThread.Start();Thread catchScreen = new Thread(screenUpdate);catchScreen.Start();IsWork = true;}private void ListenClientConnect(){while (true){Socket client = server.Accept();Thread sendThread = new Thread(sendPic);sendThread.Start(client);}}private void screenUpdate(){Bitmap temp = new Bitmap(screenWidth, screenHeight);Graphics gc = Graphics.FromImage(temp);while (true){gc.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(screenWidth, screenHeight));imgtoBytes(temp);screenNow = new Bitmap(temp);GC.Collect();Thread.Sleep(500);}}private void imgtoBytes(Bitmap bitmap){MemoryStream ms = new MemoryStream();bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);buffer = ms.GetBuffer();ms.Close();}private void sendPic(object clientSocket){Socket client = (Socket)clientSocket;byte[] receiveBuffer = new byte[1024];byte[] imageCopy;while (true){try{//客户端返回确认后才发送新的数据int receiveLength = client.Receive(receiveBuffer);imageCopy = new byte[buffer.Length];Buffer.BlockCopy(buffer, 0, imageCopy, 0, buffer.Length);byte[] dataLength = BitConverter.GetBytes(imageCopy.Length);client.Send(dataLength);receiveLength = client.Receive(receiveBuffer);client.Send(imageCopy);}catch{//do Nothing,just break}}}}
}

客户端代码:

using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;namespace screenClient
{public partial class clientWin : Form{public clientWin(){InitializeComponent();}private void startButton_Click(object sender, EventArgs e){string ipPort = configBox.Text;string[] config = ipPort.Split(':');if (config.Length!=2){MessageBox.Show("请输入正确的ip和端口号!");return;}string IP = config[0];int port = Convert.ToInt32(config[1]);try{IPAddress ip = IPAddress.Parse(IP);Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);clientSocket.Connect(new IPEndPoint(ip, port));Thread imageUpdate = new Thread(update);imageUpdate.Start(clientSocket);}catch (Exception ex){MessageBox.Show("建立连接失败,请重试!");}}private void update(object clientSocket){Socket client = (Socket)clientSocket;int receiveNumber;byte[] buffer;byte[] image;while (true){//先发送一个确认连接包buffer = new byte[1];buffer[0] = 1;client.Send(buffer);//先记录数据的大小,再申请对应大小的缓冲区buffer = new byte[4];receiveNumber = client.Receive(buffer);int dataLength =  BitConverter.ToInt32(buffer, 0);client.Send(buffer);buffer = new byte[4096];image = new byte[dataLength];GC.Collect();int offset = 0;while (offset != dataLength){receiveNumber = client.Receive(buffer);Buffer.BlockCopy(buffer, 0, image, offset, receiveNumber);offset += receiveNumber;}pictureBox.Image = getBitmap(image);}}private Bitmap getBitmap(byte[] bytesData){MemoryStream ms1 = new MemoryStream(bytesData);Bitmap bm = (Bitmap)Image.FromStream(ms1);ms1.Close();return bm;}}
}

使用方式:
       首先打开服务器端,填入端口号(建议10000~65534),然后点击监听端口按钮(这个时候会给出本机ip,但我限定了局域网192.168.199和114.213前缀,可自行查询ip或者修改代码),再启动服务即可。提供了浏览功能~客户端填入ip地址和端口号即可。

C# 实现局域网的windows环境下的桌面分享相关推荐

  1. 第二课 如何在WINDOWS环境下搭建以太坊开发环境

    [本文目标] 根据本文指导,可以在WINDOUWS环境下完成以太坊智能合约部署前的比较环境准备. [技术收获] 如何在WINDOW(笔者以WINDOWS 10为例)环境搭建以太坊开发环境,按照以下安装 ...

  2. windows环境下snort的安装

    windows环境下snort的安装 snort (一) windows环境下snort的安装 1.MYSQL安装. 2.apache安装 3.php安装 4.配置PHP 5.安装配置adodb 6. ...

  3. 计算机网络组建对等网,计算机网络实验二组建WINDOWS环境下的对等网并共享资源.pdf...

    实验课程名称 计算机网络实验 专 业 班 级 学 生 姓 名 学 号 指 导 教 师 2012 至 2013 学年第 一 学期第 1 至 18 周 <计算机网络实验>实验报告 __2012 ...

  4. resin-pro-4.0.34 服務器在windows环境下的配置

    resin-pro-4.0.34 服務器在windows环境下的配置 (轉載请注明作者:icelong) 到caucho網站上http://www.caucho.com/download/ 下載 re ...

  5. Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI

    Windows环境下Unicode编程总结 UNICODE环境设置 在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下. UN ...

  6. mysql8.0卸载出现问题,Windows环境下MySQL 8.0 的安装、配置与卸载

    软件版本 Windows:Windows10 MySQL:mysql-8.0.17-winx64.zip 安装步骤 1.配置环境变量 2.新建my.ini文件 文件位置:C:\Program File ...

  7. php-cgi和php-fpm,Windows环境下解决Nginx+php并发访问阻塞问题。

    php-cgi 是运行php, php-fpm是守护php-cgi进程 nginx配置目录运行php         location  ~ \.php$         {              ...

  8. Redis学习笔记~Redis在windows环境下的安装

    Redis是一个key-value的存储系统,它最大的特点就是可以将数据序列化到文件中. redis存储在服务器的内存或者文件中,它不是session,不是cookies,它只是个更安全,更稳定,更可 ...

  9. Windows环境下在IDEA编辑器中spark开发安装步骤

    以下是windows环境下安装spark的过程: 1.安装JDK(version:1.8.0.152) 2.安装scala(version:2.11/2.12) 3.安装spark(version:s ...

  10. windows环境下搭建rabbitMQ开发环境

    2019独角兽企业重金招聘Python工程师标准>>> windows环境下搭建rabbitMQ开发环境 1.下载与安装 erlang rabbitmq 是使用erlang语言开发的 ...

最新文章

  1. 存储引擎 K/V 分离下的index回写问题
  2. Centos 常用系统命令
  3. Fast RCNN 训练自己数据集 (1编译配置)
  4. 查找窗口隐藏了怎么办_如何快速查找网站管理页面
  5. lsof -i:port 的作用
  6. 阿里云ACM:云原生配置管理利器,让云上的Spring Cloud应用配置管理舞动起来
  7. 使用haskell来解线性方程
  8. c语言指针地址交换程序,C语言-基础教程-指针的地址分配
  9. Linux下setsockopt函数返回-1,errno=22
  10. C++ 实现一个虚拟聊天软件
  11. 关于ChartControl的绑定数据源使用
  12. 聊聊Java中代码优化的30个小技巧
  13. android七牛云存储,使用七牛云存储上传android本地视频并播放
  14. 人类一败涂地显示启动服务器失败,人类一败涂地进不去解决方法-人类跌落梦境手游进不去方法详解...
  15. 二叉树的基本概念和性质
  16. Redis应用项目---抢红包功能(三)
  17. 如何完全卸载oracle
  18. 百度nlp实习生转岗(猝)
  19. 干净卸载 Loadrunner  win7
  20. CSS 8 品优购项目

热门文章

  1. ubuntu16.04安装caffe教程(仅cpu)
  2. PCB工程师为你详解FPC排线及其用途
  3. 大漠插件7.2209
  4. 多家广告聚合平台的混战:国内移动广告聚合平台大盘点
  5. 常见的9种前端跨域解决方案详解
  6. Ubuntu环境下读取罗技G29方向盘信息
  7. XMind 2022 使用教程
  8. 怎么让HTML的属性横着排,css标签怎么设置横向排列
  9. 如何突破百度云下载速度限制
  10. 每天几道面试题SSM面试题