为什么多线程能够加快文件网络qq文件传输速度设置

6118人阅读
JAVA(158)
由于需要研究了下用 java socket 传输文件,由于需要传输多个文件,因此,采用了多线程设计。客户端每个线程创建一个 socket 连接,每个 socket 连接负责传输一个文件,服务端的ServerSocket每次 accept 一个 socket 连接,创建一个线程用于接收客户端传来的文件。
&&& import java.io.BufferedInputS &
&&& import java.io.BufferedOutputS &
&&& import java.io.DataInputS &
&&& import java.io.DataOutputS &
&&& import java.io.FileOutputS &
&&& import java.net.ServerS &
&&& import java.net.S &
&&& import java.util.concurrent.ExecutorS &
&&& import java.util.concurrent.E &
&&& public class TransferServer { &
&&&&&&& private int defaultBindPort = Constants.DEFAULT_BIND_PORT;&&& //默认监听端口号为10000 &
&&&&&&& private int tryBindTimes = 0;&&&&&&&&&& //初始的绑定端口的次数设定为0 &
&&&&&&&& &
&&&&&&& private ServerSocket serverS&&&&& //服务套接字等待对方的连接和文件发送 &
&&&&&&&& &
&&&&&&& private ExecutorService executorS&&& //线程池 &
&&&&&&& private final int POOL_SIZE = 4;&&&&&&&&&&& //单个CPU的线程池大小& &
&&&&&&&& &
&&&&&&& /**&
&&&&&&&& * 不带参数的构造器,选用默认的端口号&
&&&&&&&& * @throws Exception&
&&&&&&&& */ &
&&&&&&& public TransferServer() throws Exception{ &
&&&&&&&&&&& try { &
&&&&&&&&&&&&&&& this.bingToServerPort(defaultBindPort); &
&&&&&&&&&&&&&&& executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE); &
&&&&&&&&&&&&&&& System.out.println(&开辟线程数 : & + Runtime.getRuntime().availableProcessors() * POOL_SIZE); &
&&&&&&&&&&& } catch (Exception e) { &
&&&&&&&&&&&&&&& throw new Exception(&绑定端口不成功!&); &
&&&&&&&&&&& } &
&&&&&&& } &
&&&&&&&& &
&&&&&&& /**&
&&&&&&&& * 带参数的构造器,选用用户指定的端口号&
&&&&&&&& * @param port&
&&&&&&&& * @throws Exception&
&&&&&&&& */ &
&&&&&&& public TransferServer(int port) throws Exception{ &
&&&&&&&&&&& try { &
&&&&&&&&&&&&&&& this.bingToServerPort(port); &
&&&&&&&&&&&&&&& executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE); &
&&&&&&&&&&& } catch (Exception e) { &
&&&&&&&&&&&&&&& throw new Exception(&绑定端口不成功!&); &
&&&&&&&&&&& } &
&&&&&&& } &
&&&&&&&& &
&&&&&&& private void bingToServerPort(int port) throws Exception{ &
&&&&&&&&&&& try { &
&&&&&&&&&&&&&&& serverSocket = new ServerSocket(port); &
&&&&&&&&&&&&&&& System.out.println(port); &
&&&&&&&&&&&&&&& System.out.println(&服务启动!&); &
&&&&&&&&&&& } catch (Exception e) { &
&&&&&&&&&&&&&&& this.tryBindTimes = this.tryBindTimes + 1; &
&&&&&&&&&&&&&&& port = port + this.tryBindT &
&&&&&&&&&&&&&&& if(this.tryBindTimes &= 20){ &
&&&&&&&&&&&&&&&&&&& throw new Exception(&您已经尝试很多次了,但是仍无法绑定到指定的端口!请重新选择绑定的默认端口号&); &
&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&& //递归绑定端口 &
&&&&&&&&&&&&&&& this.bingToServerPort(port); &
&&&&&&&&&&& } &
&&&&&&& } &
&&&&&&&& &
&&&&&&& public void service(){ &
&&&&&&&&&&& Socket socket = &
&&&&&&&&&&& while (true) { &
&&&&&&&&&&&&&&& try { &
&&&&&&&&&&&&&&&&&&& socket = serverSocket.accept(); &
&&&&&&&&&&&&&&&&&&& executorService.execute(new Handler(socket)); &
&&&&&&&&&&&&&&& } catch (Exception e) { &
&&&&&&&&&&&&&&&&&&& e.printStackTrace(); &
&&&&&&&&&&&&&&& } &
&&&&&&&&&&& } &
&&&&&&& } &
&&&&&&&& &
&&&&&&& class Handler implements Runnable{ &
&&&&&&&&&&& private S &
&&&&&&&&&&&& &
&&&&&&&&&&& public Handler(Socket socket){ &
&&&&&&&&&&&&&&& this.socket = &
&&&&&&&&&&& } &
&&&&&&&&&&& public void run() { &
&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& System.out.println(&New connection accepted & + socket.getInetAddress() + &:& + socket.getPort()); &
&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& DataInputStream dis = &
&&&&&&&&&&&&&&& DataOutputStream dos = &
&&&&&&&&&&&&&&& int bufferSize = 8192; &
&&&&&&&&&&&&&&& byte[] buf = new byte[bufferSize]; &
&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& try { &
&&&&&&&&&&&&&&&&&&& dis = new DataInputStream(new BufferedInputStream(socket.getInputStream())); &
&&&&&&&&&&&&&&&&&&& String savePath = Constants.RECEIVE_FILE_PATH + dis.readUTF(); &
&&&&&&&&&&&&&&&&&&& long length = dis.readLong(); &
&&&&&&&&&&&&&&&&&&& dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))); &
&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&&&&& int read = 0; &
&&&&&&&&&&&&&&&&&&& long passedlen = 0; &
&&&&&&&&&&&&&&&&&&& while ((read = dis.read(buf)) != -1) { &
&&&&&&&&&&&&&&&&&&&&&&& passedlen += &
&&&&&&&&&&&&&&&&&&&&&&& dos.write(buf, 0, read); &
&&&&&&&&&&&&&&&&&&&&&&& System.out.println(&文件[& + savePath + &]已经接收: & + passedlen * 100L/ length + &%&); &
&&&&&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&&&&&& System.out.println(&文件: & + savePath + &接收完成!&); &
&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& } catch (Exception e) { &
&&&&&&&&&&&&&&&&&&& e.printStackTrace(); &
&&&&&&&&&&&&&&&&&&& System.out.println(&接收文件失败!&); &
&&&&&&&&&&&&&&& }finally{ &
&&&&&&&&&&&&&&&&&&& try { &
&&&&&&&&&&&&&&&&&&&&&&& if(dos != null){ &
&&&&&&&&&&&&&&&&&&&&&&&&&&& dos.close(); &
&&&&&&&&&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&&&&&&&&&& if(dis != null){ &
&&&&&&&&&&&&&&&&&&&&&&&&&&& dis.close(); &
&&&&&&&&&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&&&&&&&&&& if(socket != null){ &
&&&&&&&&&&&&&&&&&&&&&&&&&&& socket.close(); &
&&&&&&&&&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&&&&&& } catch (Exception e) { &
&&&&&&&&&&&&&&&&&&&&&&& e.printStackTrace(); &
&&&&&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&& } &
&&&&&&&&&&& } &
&&&&&&& } &
&&&&&&&& &
&&&&&&& public static void main(String[] args) throws Exception{ &
&&&&&&&&&&& new TransferServer().service(); &
&&&&&&& } &
&&& import java.io.BufferedInputS &
&&& import java.io.DataInputS &
&&& import java.io.DataOutputS &
&&& import java.io.F &
&&& import java.io.FileInputS &
&&& import java.net.S &
&&& import java.util.ArrayL &
&&& import java.util.R &
&&& import java.util.V &
&&& import java.util.concurrent.ExecutorS &
&&& import java.util.concurrent.E &
&&& public class TransferClient { &
&&&&&&& private static ArrayList&String& fileList = new ArrayList&String&(); &
&&&&&&&& &
&&&&&&& private String sendFilePath = Constants.SEND_FILE_PATH; &
&&&&&&&& &
&&&&&&& /**&
&&&&&&&& * 带参数的构造器,用户设定需要传送文件的文件夹&
&&&&&&&& * @param filePath&
&&&&&&&& */ &
&&&&&&& public TransferClient(String filePath){ &
&&&&&&&&&&& getFilePath(filePath); &
&&&&&&& } &
&&&&&&&& &
&&&&&&& /**&
&&&&&&&& * 不带参数的构造器。使用默认的传送文件的文件夹&
&&&&&&&& */ &
&&&&&&& public TransferClient(){ &
&&&&&&&&&&& getFilePath(sendFilePath); &
&&&&&&& } &
&&&&&&&& &
&&&&&&& public void service(){ &
&&&&&&&&&&& ExecutorService executorService = Executors.newCachedThreadPool(); &
&&&&&&&&&&& Vector&Integer& vector = getRandom(fileList.size()); &
&&&&&&&&&&& for(Integer integer : vector){ &
&&&&&&&&&&&&&&& String filePath = fileList.get(integer.intValue()); &
&&&&&&&&&&&&&&& executorService.execute(sendFile(filePath)); &
&&&&&&&&&&& } &
&&&&&&& } &
&&&&&&&& &
&&&&&&& private void getFilePath(String dirPath){ &
&&&&&&&&&&& File dir = new File(dirPath); &
&&&&&&&&&&& File[] files = dir.listFiles(); &
&&&&&&&&&&& if(files == null){ &
&&&&&&&&&&&&&&& &
&&&&&&&&&&& } &
&&&&&&&&&&& for(int i = 0; i & files. i++){ &
&&&&&&&&&&&&&&& if(files[i].isDirectory()){ &
&&&&&&&&&&&&&&&&&&& getFilePath(files[i].getAbsolutePath()); &
&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&& else { &
&&&&&&&&&&&&&&&&&&& fileList.add(files[i].getAbsolutePath()); &
&&&&&&&&&&&&&&& } &
&&&&&&&&&&& } &
&&&&&&& } &
&&&&&&&& &
&&&&&&& private Vector&Integer& getRandom(int size){ &
&&&&&&&&&&& Vector&Integer& v = new Vector&Integer&(); &
&&&&&&&&&&& Random r = new Random(); &
&&&&&&&&&&& boolean b = &
&&&&&&&&&&& while(b){ &
&&&&&&&&&&&&&&& int i = r.nextInt(size); &
&&&&&&&&&&&&&&& if(!v.contains(i)) &
&&&&&&&&&&&&&&&&&&& v.add(i); &
&&&&&&&&&&&&&&& if(v.size() == size) &
&&&&&&&&&&&&&&&&&&& b = &
&&&&&&&&&&& } &
&&&&&&&&&&& &
&&&&&&& }&&&& &
&&&&&&&& &
&&&&&&& private static Runnable sendFile(final String filePath){ &
&&&&&&&&&&& return new Runnable(){ &
&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& private Socket socket = &
&&&&&&&&&&&&&&& private String ip =&localhost&; &
&&&&&&&&&&&&&&& private int port = 10000; &
&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& public void run() { &
&&&&&&&&&&&&&&&&&&& System.out.println(&开始发送文件:& + filePath); &
&&&&&&&&&&&&&&&&&&& File file = new File(filePath); &
&&&&&&&&&&&&&&&&&&& if(createConnection()){ &
&&&&&&&&&&&&&&&&&&&&&&& int bufferSize = 8192; &
&&&&&&&&&&&&&&&&&&&&&&& byte[] buf = new byte[bufferSize]; &
&&&&&&&&&&&&&&&&&&&&&&& try { &
&&&&&&&&&&&&&&&&&&&&&&&&&&& DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); &
&&&&&&&&&&&&&&&&&&&&&&&&&&& DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); &
&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&&&&&&&&&&&&& dos.writeUTF(file.getName()); &
&&&&&&&&&&&&&&&&&&&&&&&&&&& dos.flush(); &
&&&&&&&&&&&&&&&&&&&&&&&&&&& dos.writeLong(file.length()); &
&&&&&&&&&&&&&&&&&&&&&&&&&&& dos.flush(); &
&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&&&&&&&&&&&&& int read = 0; &
&&&&&&&&&&&&&&&&&&&&&&&&&&& int passedlen = 0; &
&&&&&&&&&&&&&&&&&&&&&&&&&&& long length = file.length();&&& //获得要发送文件的长度 &
&&&&&&&&&&&&&&&&&&&&&&&&&&& while ((read = fis.read(buf)) != -1) { &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& passedlen += &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& System.out.println(&已经完成文件 [& + file.getName() + &]百分比: & + passedlen * 100L/ length + &%&); &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& dos.write(buf, 0, read); &
&&&&&&&&&&&&&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&&&&&&&&&&&&& dos.flush(); &
&&&&&&&&&&&&&&&&&&&&&&&&&& fis.close(); &
&&&&&&&&&&&&&&&&&&&&&&&&&& dos.close(); &
&&&&&&&&&&&&&&&&&&&&&&&&&& socket.close(); &
&&&&&&&&&&&&&&&&&&&&&&&&&& System.out.println(&文件 & + filePath + &传输完成!&); &
&&&&&&&&&&&&&&&&&&&&&&& } catch (Exception e) { &
&&&&&&&&&&&&&&&&&&&&&&&&&&& e.printStackTrace(); &
&&&&&&&&&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& private boolean createConnection() { &
&&&&&&&&&&&&&&&&&&& try { &
&&&&&&&&&&&&&&&&&&&&&&& socket = new Socket(ip, port); &
&&&&&&&&&&&&&&&&&&&&&&& System.out.println(&连接服务器成功!&); &
&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&&&&& } catch (Exception e) { &
&&&&&&&&&&&&&&&&&&&&&&& System.out.println(&连接服务器失败!&); &
&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&&&&& }& &
&&&&&&&&&&&&&&& } &
&&&&&&&&&&&&&&&& &
&&&&&&&&&&& }; &
&&&&&&& } &
&&&&&&&& &
&&&&&&& public static void main(String[] args){ &
&&&&&&&&&&& new TransferClient().service(); &
&&&&&&& } &
&&& public interface Constants { &
&&&&&&& public final static String RECEIVE_FILE_PATH = &E:\\receive\\&; &
&&&&&&&& &
&&&&&&& public final static String SEND_FILE_PATH = &E:\\send&; &
&&&&&&&& &
&&&&&&& public final static int DEFAULT_BIND_PORT = 10000; &
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2251037次
积分:21843
积分:21843
排名:第328名
原创:300篇
转载:187篇
译文:20篇
评论:515条
(2)(2)(2)(8)(1)(1)(1)(3)(1)(1)(7)(6)(9)(3)(2)(7)(4)(5)(3)(2)(2)(2)(6)(1)(4)(1)(3)(6)(3)(3)(11)(8)(2)(3)(5)(12)(2)(15)(1)(6)(2)(5)(3)(10)(10)(4)(2)(1)(8)(4)(4)(7)(7)(1)(4)(2)(1)(3)(1)(1)(6)(3)(3)(2)(1)(3)(9)(14)(3)(6)(5)(9)(2)(3)(12)(5)(24)(1)(1)(4)(2)(2)(11)(5)(4)(6)(10)(2)(12)(4)(21)(18)(4)(6)(38)多线程文件传输_文档库
文档库最新最全的文档下载
当前位置: & 多线程文件传输
多线程文件传输
很多人都有过使用网络蚂蚁或网络快车软件下载互联网文件的经历,这些软件的使用可以大大加速互联网上文件的传输速度,减少文件传输的时间。这些软件为什么有如此大的魔力呢?其主要原因是这些软件都采用了多线程下载和断点续传技术。如果我们自己来编写一个类似这样的程序,也能够快速的在互联网上下载文件,那一定是非常愉快的事情。下面我就讲一讲如何利用C#语言编写一个支持多线程下载文件的程序,你会看到利用C#语言编写网络应程序是多么的容易,从中也能体会到C#语言中强大的网络功能。
首先介绍一下HTTP 协议,HTTP 亦即Hpyer Text Transfer Protocal的缩写,它是现代互联网上最重要的一种网络协议,超文本传输协议位于TCP/IP协议的应用层,是一个面向无连接、简单、快速的C/S结构的协议。HTTP 的工作过程大体上分连接、请求、响应和断开连接四个步骤。C#语言对HTTP 协议提供了良好的支持,在.NET 类库中提供了WebRequest 和WebResponse 类,这两个类都包含在http://www.wendangku.net/doc/d7f80e0e844769eae009ed2b.html
命名空间中,利用这两个类可以实现很多高级的网络功能,本文中多线程文件下载就是利用这两个类实现的。 WebRequest 和WebResponse 都是抽象基类,因此在程序中不能直接作为对象使用,必须被继承,实际使用中,可根据URI 参数中的URI 前缀选用它们合适的子类,对于HTTP 这类URI,HttpWebRequest 和HttpWebResponse 类可以用于处理客户程序同WEB 服务器之间的HTTP 通讯。
HttpWebRequest 类实现了很多通过HTTP 访问WEB 服务器上文件的高级功能。HttpWebRequest 类对WebRequest 中定义的属性和方法提供支持,HttpWebRequest 将发送到Internet 资源的公共HTTP 标头的值公开为属性,由方法或系统设置,常用的由属性或方法设置的HTTP 标头为:接受, 由Accept 属性设置, 连接, 由Connection 属性和KeepAlive 属性设置, Content-Length, 由ContentLength 属性设置, Content-Type, 由ContentType 属性设置, 范围, 由AddRange 方法设置.
实际使用中是将标头信息正确设置后, 传递到WEB 服务器,WEB 服务器根据要求作出回应。
HttpWebResponse 类继承自WebResponse 类,专门处理从WEB 服务器返回的HTTP 响应,这个类实现了很多方法,具有很多属性,可以全面处理接收到的互联网信息。在HttpWebResponse 类中,对于大多数通用的HTTP 标头字段,都有独立的属性与其对应,程序员可以通过这些属性方便的访问位于HTTP 接收报文标头字段中的信息,本例中用到的HttpWebResponse 类属性为:ContentLength 既接收内容的长度。
有了以上的了解后,下面看看这两个类的用法,要创建HttpWebRequest 对象,不要直接使用HttpWebRequest 的构造函数,而要使用WebRequest.Create 方法初始化一个HttpWebRequest 实例,如:
Word文档免费下载:
TCP多线程非阻塞文件传输(文件流形式传输,支持对多客户进行 超大文件的传输)_计算机软件及应用_IT/计算机_专业资料。TCP多线程 用文件流的形式 实现 文件的 非阻塞...C++ p2p 实现多线程文件传输时间: 21:27 来源:未知 作者:admin 点击: 次 在如今的网络应用中,文件的传送是重要的功能之一,也是共享的基 在如今的...p2p实现多线程文件传输_IT/计算机_专业资料。p2p 实现多线程文件传输 2007 年 09 月 17 日 星期一 11:21 什么是 P2P 技术呢?P2P 是 peer-to-peer 的缩写,...《操作系统》实验报告实验序号:9 学号实 1-416 姓名 实验项目名称:Linux 多线程文件传输实现 专业、班 实验时间
实验地点 指导教师 一、实验目的及...多线程断点续传文件的原理_计算机软件及应用_IT/计算机_专业资料。多线程断点续传文件的原理 多线程传输实现多线程传输实现 实现原理: 将源文件按长度为分为 N 块...多线程文件传输的实现方法及其性能的研究_IT/计算机_专业资料。维普资讯
多线程文件传输的实现方法 及其性能的研究 。 撰文/ 黄毅嶂 丰主...C_实现HTTP协议下的多线程文件传输_IT/计算机_专业资料。C#文件上传用C#实现 HTTP 协议下的多线程文件传输 实现很多人都有过使用网络蚂蚁或网络快车软件下载互联网...关键 词~CP多 线程 sktT;o 1引言 .文件传输功能成为现在流行 的即时通信工具不可少 的一部分。 要实现一个功 能较 完善的文件传输工具 .若只 能实 现...l数字 技术 丽 应 用研 究 基于多线程的网络文件传输工具的改进 高芳 ( 国家新 闻 出版 广电 总局 七二 五台山 西灵 山031308) 摘要 : 随着计 算机技术...君,已阅读到文档的结尾了呢~~
多线程网络文件传输系统的设计与实现(已处理),实现多线程,java实现多线程,java如何实现多线程,如何实现多线程,传输系统,多线程处理,java 多线程处理,安全公文传输系统,光纤传输系统,公文传输系统
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
多线程网络文件传输系统的设计与实现(已处理)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 怎么加快usb传输速度 的文章

 

随机推荐