前言:
以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.Receive来接收,在这里,哥会在详细讲解。
5、关闭套接字
s.close()
服务器
服务器的套接字,就有所不同,它不是链接对方,而是等待,所以它需要绑定自己能够提供服务的IP地址和相应的端口号,当等待的时候,会出现中断。所以要考虑多线程。
现在主要是处理接收大文件的方法。先取出文件的大小。
MS.sava去保存你要的格式。
好,基本上讲到这里。
具体代码可以到微云下载【链接: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];
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去保存你要的格式。
好,基本上讲到这里。