C#局域网桌面共享软件制作(二)
如果你运行这个软件查看流量监控就会发现1~2M/s左右的上传下载,并且有时会报错“参数无效”,如果你将屏幕截图保存到本地的话每张图片大概4M(bmp)、120KB(jpg),按照1秒传送10张图片计算,可想而知网络流量占用很大。下面我们将一一解决这些问题
1.压缩客户端图片
压缩函数(需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();
ept = new EncoderParameter(ecd, 10L);
eptS.Param[] = 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;
}
客户端线程执行体改为
private void threadimage()
{
try
{
while (true)
{
MemoryStream ms = new MemoryStream();
CompressImage(GetScreen(), ms);//很明显传引用
byte[] b = ms.ToArray();
sendsocket.Send(b);
Thread.Sleep();
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
return;
}
}
好了压缩后的图片只有38k左右
2.服务端报错处理
“参数无效”错误原因是
byte[] b = new byte[ * ];
hostSocket.Receive(b);
MemoryStream ms = new MemoryStream(b);
Image img=Image.FromStream(ms);//ms数据错误不能转换为Image
为什么ms无效?原因是图片大小超过了字节数组b的容量,或传回的数据丢失或有空的内容
解决方法:既然字节数组容量小了,我们就增大它的容量。如byte[] b = new byte[1024 * 10000];增加10倍
由于我们已经在客户端压缩图片了,所以就不用在考虑这点了。
另一点就是在将数据接收后判断数据是否为一张图片,如果不是就丢弃。
实现代码
private bool getImage(MemoryStream ms,out Image image)
{
try
{
image = Image.FromStream(ms);
return true;
}
catch
{
image = null;
return false;
}
}
服务器线程执行体改为
private void trreadimage()
{
try
{
while (true)
{byte[] b = new byte[ * ];
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)}循环接收数据以节省内存分配吧.
需要说明的是:如果你还有更好的解决方法请分享给我们,当然这个程序还未完,上面只是解决问题的一些方法
转载,请注明出处和相关链接,否则追究其法律责任!
C#局域网桌面共享软件制作(二)的更多相关文章
- C#局域网桌面共享软件制作(三)
到周末了,继续做这个桌面共享软件,下面是前两篇的链接, 链接 C#局域网桌面共享软件制作(一) 链接 C#局域网桌面共享软件制作(二) 通过对图片进行压缩以后,每张图片大小38K左右(win7/102 ...
- C#局域网桌面共享软件制作(一)
很久没有写文章了,今天分享的内容是局域网桌面共享软件,相信很多人都做过,也可能遇到一些问题,这里我将一一测试. 涉及到的内容有:局域网文件传输.桌面截屏.图片压缩等.为了更直白的演示程序的功能所以没有 ...
- ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(二)
ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(二) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (二)nvidia docker配 ...
- 关于APP上架制作二维码相关
1.安卓版本APP上架并生成二维码问题:安卓版本上架国内市场,这个情况比较复杂一些,比如百度,网址是以上传APP生成的一个编号来进行的,每次升级更新后都发生了变化,也就相当于每次升级后网址发生改变(比 ...
- 利用Python制作二维码
利用简单的Python代码制作二维码 一.制作工具 安装Python环境 + PyCharm编译器. 二.电脑系统 本人win10 + Python3.7.0 + PyCharm. 三.写代码前先下载 ...
- 从桌面到 Web - 二十几天学 ASP.NETCore 1
这么多年一直从事桌面开发,一直没有时间好好学学 web 开发.感觉自己就像从石器时代走来的古代类人猿.由于工作的调整,现在终于有时间学习一下 Web 开发.出于对技术和框架的熟悉和继承,决定还是学习 ...
- 如何使用二维码进行表白-一键制作二维码,gif二维码制作
" 如何使用二维码进行表白-一键制作二维码" 二维码在我们现在生活中随处可见,因为一次突发奇想,那我们可不可以制作一个自己的二维码呢!然后让女朋友去扫描一下----嘿嘿嘿--不行, ...
- wpf 客户端【JDAgent桌面助手】开发详解(二)桌面宠物制作详解
目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]开发详解(一)主窗口 ...
- C# 使用UDP组播实现局域网桌面共享
最近需要在产品中加入桌面共享的功能,暂时不用实现远程控制:参考了园子里的一些文章,加入了一些自己的修改. 需求:将一台机器的桌面通过网络显示到多个客户端的屏幕上,显示内容可能为PPT,Word文档之类 ...
随机推荐
- Struts中<s:checkboxlist>的用法
一.JSP中 ①集合为list <s:checkboxlist name="list" list="{'Java','.Net','RoR','PHP'}" ...
- C++学习33 函数模板
在<C++函数重载>一节中,为了求三个数的最大值,我们通过函数重载定义了三个名字相同.参数列表不同的函数,如下所示: //求三个整数的最大值 int max(int a, int b, i ...
- angularjs之表达式
一:angularjs表达式的解析 angularjs会在运行$digest循环中自动解析表达式,但有时手动解析表达式也是非常用用的. angularjs通过$parse这个内部服务来进行表达式的运算 ...
- Linux命令 find和mv的结合使用:查找文件,移动到某个目录
显示前十个文件 [root@localhost smgpbi]# ls -1 | sort -u | head -10 1.首先查看文件个数,进入所在的文件 # find . -name " ...
- [SQL]断开并更改数据库名
EXEC sp_dboption 'my', 'Single User', 'TRUE' EXEC sp_renamedb 'my', 'mycrjtest' EXEC sp_dboption 'my ...
- 《Code Complete》ch.20 软件质量概述
WHAT & WHY ? 软件质量的特性 外在特性 正确性(Correctness) 可用性(Usability) 效率(Efficiency) 可靠性(Reliability) 完整性(In ...
- Windows Phone 版 Cocos2d-x 程序的结构
我们已经创建了一个 MyGame 的初始应用,这个应用的结构是什么样的呢? 一.应用程序入口 在 cpp-tests 中,app.xaml.cs 是标准的应用程序入口.与普通的 Windows Pho ...
- js面向过程改写成面向对象--通用方法
响亮的标题:一个万能的,保底的.面向过程改写成面向对象的方法 前提朗读:很多刚接触js面向对象的时候都不知道如何能快速的写出一个面向对象的程序,这个是必然的现象,不是每一位学js的一上来就会写面向对象 ...
- 【Unity Shaders】学习笔记——SurfaceShader(六)混合纹理
[Unity Shaders]学习笔记——SurfaceShader(六)混合纹理 转载请注明出处:http://www.cnblogs.com/-867259206/p/5619810.html 写 ...
- EndNote文献管理
一直想写个博客,但是一直没有好好坐下来对自己工作进行一个梳理.从今天开始吧,争取多写一点. 今天,先介绍一下科技论文写作中经常使用的一款软件EndNote,这个软件,掌握它的使用方法后会觉得很方便:但 ...