链接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#局域网桌面共享软件制作(二)的更多相关文章

  1. C#局域网桌面共享软件制作(三)

    到周末了,继续做这个桌面共享软件,下面是前两篇的链接, 链接 C#局域网桌面共享软件制作(一) 链接 C#局域网桌面共享软件制作(二) 通过对图片进行压缩以后,每张图片大小38K左右(win7/102 ...

  2. C#局域网桌面共享软件制作(一)

    很久没有写文章了,今天分享的内容是局域网桌面共享软件,相信很多人都做过,也可能遇到一些问题,这里我将一一测试. 涉及到的内容有:局域网文件传输.桌面截屏.图片压缩等.为了更直白的演示程序的功能所以没有 ...

  3. ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(二)

    ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(二) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (二)nvidia docker配 ...

  4. 关于APP上架制作二维码相关

    1.安卓版本APP上架并生成二维码问题:安卓版本上架国内市场,这个情况比较复杂一些,比如百度,网址是以上传APP生成的一个编号来进行的,每次升级更新后都发生了变化,也就相当于每次升级后网址发生改变(比 ...

  5. 利用Python制作二维码

    利用简单的Python代码制作二维码 一.制作工具 安装Python环境 + PyCharm编译器. 二.电脑系统 本人win10 + Python3.7.0 + PyCharm. 三.写代码前先下载 ...

  6. 从桌面到 Web - 二十几天学 ASP.NETCore 1

    这么多年一直从事桌面开发,一直没有时间好好学学  web 开发.感觉自己就像从石器时代走来的古代类人猿.由于工作的调整,现在终于有时间学习一下 Web 开发.出于对技术和框架的熟悉和继承,决定还是学习 ...

  7. 如何使用二维码进行表白-一键制作二维码,gif二维码制作

    " 如何使用二维码进行表白-一键制作二维码" 二维码在我们现在生活中随处可见,因为一次突发奇想,那我们可不可以制作一个自己的二维码呢!然后让女朋友去扫描一下----嘿嘿嘿--不行, ...

  8. wpf 客户端【JDAgent桌面助手】开发详解(二)桌面宠物制作详解

    目录区域: wpf 客户端[JDAgent桌面助手]业余开发的终于完工了..晒晒截 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]开发详解(一)主窗口 ...

  9. C# 使用UDP组播实现局域网桌面共享

    最近需要在产品中加入桌面共享的功能,暂时不用实现远程控制:参考了园子里的一些文章,加入了一些自己的修改. 需求:将一台机器的桌面通过网络显示到多个客户端的屏幕上,显示内容可能为PPT,Word文档之类 ...

随机推荐

  1. tiny210裸机第1课(启动原理)

    软硬件环境 宿主机系统:ubuntu 板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand 交叉编译器:arm-linux-gcc-4.5.1 手册:S5PV ...

  2. vb中&和+的区别

    在字符串连接时+号只能是两个字符串线连接&号可以是字符串与另一种类型的数据相连接.例如"a"+"b"是合法的,而 "a"+2是错误的 ...

  3. testng.xml创建及解析

    项目右键---TestNG -----> Convert to TestNG 会自动产生一个testng.xml的文件 http://www.cnblogs.com/choosewang/art ...

  4. IGeoDatabaseBridge2.GetLineOfSight

    IGeoDatabaseBridge2.GetLineOfSight Method Returns a line-of-site indicator interpolated from the TIN ...

  5. POJ 3744 【矩阵快速幂优化 概率DP】

    搞懂了什么是矩阵快速幂优化.... 这道题的重点不是DP. /* 题意: 小明要走某条路,按照个人兴致,向前走一步的概率是p,向前跳两步的概率是1-p,但是地上有地雷,给了地雷的x坐标,(一维),求小 ...

  6. [ZOJ 1003] Crashing Balloon (dfs搜索)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3 题目大意:给你a,b两个数,问当b由约数1到100组成时,a能否由其 ...

  7. Asteroids (最小覆盖)

    题目很简单,但是需要推到出二分图最大匹配 = 最小覆盖 最小覆盖:证明过程http://blog.sina.com.cn/s/blog_51cea4040100h152.html Descriptio ...

  8. SQL Server int类型值最大2147483647(2^31 - 1)

    突发奇想,一个字增字段,假设每天增加1000条记录,多少年之后写不进int类型的字段了2147483647 / 1000 / 365 = 5883.51684109589041095890410958 ...

  9. http是什么?

    http HyperText Transfer Protocol 超文本传输协议,是一个应用层通信协议. 可以用wireshark抓取.

  10. 举例说明划分子网,路由器IP地址

    划分子网的方法是从网络的主机号借用若干位作为子网号,主机号相应地减少了同样的位数.在划分子网前,IP地址是两级结构的:网络号,主机号. 划分子网后,两级IP地址在本单位内部就变为三级IP地址:网络号, ...