日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#局域网桌面共享软件制作(二)

發(fā)布時間:2023/12/14 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#局域网桌面共享软件制作(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

鏈接C#局域網桌面共享軟件制作(一)

如果你運行這個軟件查看流量監(jiān)控就會發(fā)現(xiàn)1~2M/s左右的上傳下載,并且有時會報錯“參數(shù)無效”,如果你將屏幕截圖保存到本地的話每張圖片大概4M(bmp)、120KB(jpg),按照1秒傳送10張圖片計算,可想而知網絡流量占用很大。下面我們將一一解決這些問題

1.壓縮客戶端圖片

壓縮函數(shù)(需using System.Drawing.Imaging;)

/// <summary>/// 壓縮圖片,將壓縮后的圖片存入MemoryStream/// </summary>/// <param name="bitmap">原圖片</param>/// <param name="ms">內存流</param>public void CompressImage(Bitmap bitmap, MemoryStream ms){ ImageCodecInfo ici = null;Encoder ecd = null; EncoderParameter ept = null; EncoderParameters eptS = null;try{ici = this.getImageCoderInfo("image/jpeg");ecd = Encoder.Quality;eptS = new EncoderParameters(1);ept = new EncoderParameter(ecd, 10L);eptS.Param[0] = ept;bitmap.Save(ms, ici, eptS);}catch (Exception ex){throw new Exception(ex.Message);}finally{ept.Dispose();eptS.Dispose();}}/// <summary> /// 獲取圖片編碼信息 /// </summary> /// <param name="coderType">編碼類型</param> /// <returns>ImageCodecInfo</returns> private ImageCodecInfo getImageCoderInfo(string coderType){ImageCodecInfo[] iciS = ImageCodecInfo.GetImageEncoders();ImageCodecInfo retIci = null;foreach (ImageCodecInfo ici in iciS){if (ici.MimeType.Equals(coderType))retIci = ici;}return retIci;}

客戶端線程執(zhí)行體改為

private void threadimage(){try{while (true){MemoryStream ms = new MemoryStream();CompressImage(GetScreen(), ms);//很明顯傳引用byte[] b = ms.ToArray();sendsocket.Send(b);Thread.Sleep(100);}}catch (Exception ee){MessageBox.Show(ee.Message);return;}}

好了壓縮后的圖片只有38k左右

?

2.服務端報錯處理

“參數(shù)無效”錯誤原因是

?

byte[] b = new byte[1024 * 1000]; hostSocket.Receive(b); MemoryStream ms = new MemoryStream(b); Image img=Image.FromStream(ms);//ms數(shù)據(jù)錯誤不能轉換為Image

為什么ms無效?原因是圖片大小超過了字節(jié)數(shù)組b的容量,或傳回的數(shù)據(jù)丟失或有空的內容

解決方法:既然字節(jié)數(shù)組容量小了,我們就增大它的容量。如byte[] b = new byte[1024 * 10000];增加10倍

由于我們已經在客戶端壓縮圖片了,所以就不用在考慮這點了。

另一點就是在將數(shù)據(jù)接收后判斷數(shù)據(jù)是否為一張圖片,如果不是就丟棄。

實現(xiàn)代碼

private bool getImage(MemoryStream ms,out Image image){try{image = Image.FromStream(ms);return true;}catch{image = null;return false;}}

服務器線程執(zhí)行體改為

private void trreadimage(){try{ while (true){byte[] b = new byte[1024 * 1000];hostSocket.Receive(b);MemoryStream ms = new MemoryStream(b);Image img;if (getImage(ms, out img)){picReceive.Image = img;}}}catch (Exception ee){MessageBox.Show(ee.Message);thread.Abort();}}

應該不會有人問為什么不用

int len=0;

byte[] b = new byte[1024];

while((len=hostSocket.Receive(b))>0)

{ms.write(b,0,b.lenth)}循環(huán)接收數(shù)據(jù)以節(jié)省內存分配吧.

?

需要說明的是:如果你還有更好的解決方法請分享給我們,當然這個程序還未完,上面只是解決問題的一些方法

轉載,請注明出處和相關鏈接,否則追究其法律責任!

轉載于:https://www.cnblogs.com/liuxiaobo93/p/3675466.html

總結

以上是生活随笔為你收集整理的C#局域网桌面共享软件制作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。