C# 实现局域网的windows环境下的桌面分享
生活随笔
收集整理的這篇文章主要介紹了
C# 实现局域网的windows环境下的桌面分享
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ?先談需求,本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环境下的桌面分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python算法工程师需要会写什么_算法
- 下一篇: c#实现的udt