传送图片程序

前言:
       以C#为程序设计基础,传输大图片,并现实。在过程中,采用套接字,单线程同步机制为例子。需要深化,可以采用异步或者多线程的机制,保障能够顺利执行。
      具体代码可以到微云下载【链接: http://url.cn/YpiyxY (密码:QJtp)】
正文:
      客户端
    网络编程,离不开套接字,客户端套接字编程需要了解和理解清楚5个部分
      1、如何初始化套接字socket
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
      2、如何有效的连接
           s.Connect("192.168.1.100",2500);
      3、发送过程
           既然哥在这里说是大文件,肯定回使用s.SendFile来处理发送过程,这也是解决大文件的好方法。
【聪明的同学】哦,原来还有这样的方法,仔细阅读MSDN才行。
【可爱的老师】当你发送文件给对方的时候,对方将会打开套接字等待你,那他怎么知道你究竟有多大呢?当不知道大小的情况下接收,会遇到很大的问题,很不方便我们处理。同学们说说,会有怎样的问题啊?
【聪明的同学】1、不知道现在的空间能否存储。2、套接字也不知道何时终止……老师怎么才能有效解决呢?
【可爱的老师】同学们,我在开始发送之前,把文件的大小,先告之对方,这样就可以啦!
【聪明的同学】那采用多少前缀字节呢?如果没有统一,到时候对方也不知道哪些是前缀,哪些是文件流?
【可爱的老师】在windows 中文件的大小是用long类型来描述的,也就是大致占有8个字节,所以WINDOWS的单独文件大小不会超过2的64次方。于是,在发送大文件之前,统一前8个字节存放文件大小,插入在文件流的最前面,然后采用数据字节流,传送给对方,对方首先也读取前8个字节,了解大小后,开始读取文件,并分析该盘符时候有空间给它存放。
【聪明的同学】老师你既然可以在前面加preStream,我是不是把我的文件名称,大小,扩展名一起存放在lastStream一起发送。
【可爱的老师】真聪明!就是这样处理。
          FileInfo fi = new FileInfo(filepath);  filepath 一般指的是URL 例如:C:\A.JPG
          byte[] len = BitConverter.GetBytes(fi.Length);
         s.SendFile(filepath,len,null,TransmitFileOptions.UseDefaultWorkerThread);
         s.Shutdown(SocketShutdown.Both);
      4、接收过程
           s.Receive来接收,在这里,哥会在详细讲解。
      5、关闭套接字
           s.close()
服务器
 服务器的套接字,就有所不同,它不是链接对方,而是等待,所以它需要绑定自己能够提供服务的IP地址和相应的端口号,当等待的时候,会出现中断。所以要考虑多线程。
现在主要是处理接收大文件的方法。先取出文件的大小。
               byte[] buffer = new byte[8];                
                s.Receive(buffer,8,0);
                long length = BitConverter.ToInt32(buffer, 0);  
   然后申请一个
  MemoryStream MS; 内存流,如果计算器还没有计算到总数那么多,接着循环执行。 
               byte[] buf=new byte[8192]; 
                while (count <length)
                {
                   readcount =s.Receive(buf, buf.Length, 0); 
                   MS.Write(buf, 0, readcount);
                   count += readcount;
              } 
这样,将把所要的流读入了MS中,如果是图片,可以直接使用Image.FromStream(MS)提供给pictureBox显示,当然也可以使用。
MS.sava去保存你要的格式。

好,基本上讲到这里。

转载于:https://www.cnblogs.com/seemenlee/p/5389950.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值