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文档之类 ...
随机推荐
- WCF服务在高并发情况下报目标积极拒绝的异常处理 z
http://www.cnblogs.com/kklldog/p/5037006.html wcf的监控服务,偶尔监控到目标服务会报一个目标积极拒绝的错误.一开始以为服务停止了,上服务器检查目标服务好 ...
- 把Nginx加为系统服务(service nginx start/stop/restart)
1.编写脚本,名为nginx #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - ...
- spring注解注入
@Autowired public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } @Test public void tes ...
- [Java] java中的异常处理
Java中的异常类都继承自Throwable类.一个Throwable类的对象都可以抛出(throw). Throwable对象可以分为两组.一组是unchecked异常,异常处理机制往往不用于这组异 ...
- angularjs 与django标签语法冲突的解决办法
在需要使用angularjs标签的地方套上verbatim标签,如: {% verbatim %} ... {% endverbatim %}
- MyEclipse 6.5 破解文件代码
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...
- SQL语句的执行计划(oracle表的三种链接方式)
SQL语句我们写完之后,就是分析其优化,这就要求我们了解到底数据是怎么存储. 首先我们需要了解,表链接的几种方式 nested loop join sort merge join hash join ...
- JQuery基础教程:事件(下)
事件传播 为了说明不可单击的页面元素处理单击事件的能力,例如样式转换器中包含按钮的div元素或者兄弟元素h3,我们来实现一个鼠标指针进入元素和离开元素时的效果,首先需要添加一种翻转状态,表明 ...
- jsp页面
//获取根目录 ${pageContext.request.contextPath} //(父页面提交,嵌入页面显示)提交表单,设置响应方法和返回结果页面显示在frame中 <input typ ...
- UIView之基础控件综合事例
九宫格算法实现及优化 2015年11月19日 星期四 23:21 1.九宫格之初实现 要求: 1.1在主界面中,点击添加按钮就能添加商品,点击删除按钮就能删除商品; 1.2在初始化界面中,添加按钮处于 ...