C# 实现局域网的windows环境下的桌面分享
生活随笔
收集整理的這篇文章主要介紹了
C# 实现局域网的windows环境下的桌面分享
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? ? ?先談需求,本demo源于實(shí)驗(yàn)室的師兄們找工作的時(shí)候,針對(duì)有些公司會(huì)監(jiān)視多屏幕的情況,突發(fā)奇想自己寫了一個(gè)小demo來分享屏幕,隨手寫的使用價(jià)值不大~在本機(jī)測(cè)試效果不錯(cuò),但是跨機(jī)效果很一般,不知道是不是路由器的問題。另沒有對(duì)接收發(fā)送的數(shù)據(jù)進(jìn)行校驗(yàn),只是比較基礎(chǔ)的實(shí)現(xiàn)。為什么說是局域網(wǎng),因?yàn)閿?shù)據(jù)傳輸效果太糟糕,理論遠(yuǎn)程也是可以的,沒有試。只貼出了處理代碼,界面代碼和編譯后的結(jié)果我上傳github了,可以查看
服務(wù)器代碼:
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(); //得到主機(jī)名IPHostEntry IpEntry = Dns.GetHostEntry(HostName);for (int i = 0; i < IpEntry.AddressList.Length; i++){if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork){//限制了實(shí)驗(yàn)室網(wǎng)段或者學(xué)校內(nèi)網(wǎng)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{//客戶端返回確認(rèn)后才發(fā)送新的數(shù)據(jù)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("請(qǐng)輸入正確的ip和端口號(hào)!");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("建立連接失敗,請(qǐng)重試!");}}private void update(object clientSocket){Socket client = (Socket)clientSocket;int receiveNumber;byte[] buffer;byte[] image;while (true){//先發(fā)送一個(gè)確認(rèn)連接包buffer = new byte[1];buffer[0] = 1;client.Send(buffer);//先記錄數(shù)據(jù)的大小,再申請(qǐng)對(duì)應(yīng)大小的緩沖區(qū)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;}} }使用方式:
? ? ? ?首先打開服務(wù)器端,填入端口號(hào)(建議10000~65534),然后點(diǎn)擊監(jiān)聽端口按鈕(這個(gè)時(shí)候會(huì)給出本機(jī)ip,但我限定了局域網(wǎng)192.168.199和114.213前綴,可自行查詢ip或者修改代碼),再啟動(dòng)服務(wù)即可。提供了瀏覽功能~客戶端填入ip地址和端口號(hào)即可。
總結(jié)
以上是生活随笔為你收集整理的C# 实现局域网的windows环境下的桌面分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python算法工程师需要会写什么_算法
- 下一篇: cdma特有效应_[多选] 相对于IS-