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文档之类 ...
随机推荐
- [SQL] cast 与 convert 都在什么情况下使用
CONVERT(data_type,expression[,style]) 说明: 此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,ch ...
- SELinux配置不当导致httpd无法在非80端口启动
检测是否为selinux导致httpd启动失败,若setenforce 0以后就可以启动,就表示selinux配置不当. 首先本机要支持semanage命令,安装方法网上有. semanage po ...
- Android--输入自动提示AutoCompleteTextView
布局文件: <TextView android:id="@+id/title" android:layout_width="wrap_content" a ...
- 使用spring的邮件发送功能
使用spring提供的MailSender和JavaMailSender类. 1.邮件对象类 package cn.luxh.app.mail; import java.util.List; impo ...
- IOS学习之路--BLOCK
/* 1.定义block变量: 返回值类型 (^block变量名) (参数类型1, 参数类型2, ....); 2.给block变量赋值 block变量名 = ^(参数类型1 参数名称1, ..... ...
- 如果出现isapi和CGI限制的时候
将isapi和CGI中对应的不允许改为允许即可
- Hive基础之Hive开启查询列名及行转列显示
Hive默认情况下查询结果里面是只显示值: hive> select * from click_log; OK ad_101 :: ad_102 :: ad_103 :: ad_104 :: a ...
- Centos 时间同步服务器
From: http://www.iteye.com/topic/599648 中国国家授时中心: http://www.time.ac.cn/stime.asp 其他网络时间服务器地址如下:(也可以 ...
- NOIP2013Day1解题报告
本来今天晚上拿13年NOIP的题目来做一下,测测能够得多少分,结果一晚上把Day1写完竟然AK了,吼吼吼 D1T1,题目:http://codevs.cn/problem/3285/ 很水的一道快速幂 ...
- C语言之实现控制台光标随意移动
原理引入windows.h,首先是要获得输入的东西,然后通过判断: 1.方向键:执行上下左右的移动功能 2:回车键:执行换行的功能. 3.普通键:输入功能. 终点就是要获取到屏幕上的坐标,当按下了方向 ...