java网络蚂蚁的制作流程

“网络蚂蚁”的Java实现 “网络蚂蚁”的Java实现owen1944 原创  (参与分:208,专家分:760)   发表:2002-9-20 下午9:35   版本:1.0   阅读:5485次“网络蚂蚁”、Falshget 等许多多线程下载软件都是网友的必备工具,利用这些工具可以快速从服务器上下载比较大的文件,这些工具的工作特性是把服务器端的文件分成几个段,每个段分别、同时进行下载。编写这类程序,第一、必须对HTTP协 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> java网络蚂蚁的制作流程 “网络蚂蚁”、Falshget 等许多多线程下载软件都是网友的必备工具,利用这些工具可以快速从服务器上下载比较大的文件,这些工具的工作特性是把服务器端的文件分成几个段,每个段分别、同时进行下载。编写这类程序,第一、必须对HTTP协议有较为充分的了解;第二、有效使用多线程编程手段在软件上实现。 HTTP 协议的简介 HTTP协议是一种超文本传输协议(Hypertext Transfer Protocol),工作于网络应用层,自1990年起广泛应用于WWW 的全球信息服务,HTTP协议的详细说明可以在网上查阅RFC2518、RFC2616等文档。 HTTP状态码 HTTP状态码格式是 HTTP/版本信息的数字表示。状态码例子如下: HTTP/1.0 200 OK // 表示服务器支持HTTP/1.0 协议,成功 HTTP/1.1 200 OK // 表示服务器支持HTTP/1.1 协议,成功 HTTP/1.0 404 Not Found // 表示服务器支持HTTP/1.0 协议,访问文件没有找到 在程序中间,如果读到“HTTP/1.1 200 OK”这样的字符串,表明欲下载文件存在、该服务器支持断点续传,可以使用多线程下载。如果读到“HTTP/1.0 200 OK”这样的字符串,表明欲下载文件存在、但该服务器不支持断点续传,只可以使用单线程下载。 读取重要的响应标题,获得要下载文档的文件长度 如果HTTP状态码表明访问成功,服务器会回送一些标题行,我们最关注的是Content-Length 这一行,比如,如果服务器回送“Content-Length:1000”,表明请求文件的长度是1000字节,所以读取这一行信息,可以得到文件的长度信息: 例如:GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- excel, application/msword, application/vnd.ms-powerpoint, */* Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Connection: Keep-Alive 200 Content-Length=106786028 Accept-Ranges=bytes Date=Mon, 30 Apr 2001 12:56:11 GMT ETag=W/"02ca57e173c11:95b" Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT 所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给 Web服务器的时候要多加一条信息--从哪里开始。 下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。 GET /down.zip HTTP/1.0 User-Agent: NetFox RANGE: bytes=2000070- Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 仔细看一下就会发现多了一行RANGE: bytes=2000070- 这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。 服务器收到这个请求以后,返回的信息如下: 206 Content-Length=106786028 Content-Range=bytes 2000070-106786027/106786028 Date=Mon, 30 Apr 2001 12:55:20 GMT ETag=W/"02ca57e173c11:95b" Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT 和前面服务器返回的信息比较一下,就会发现增加了一行: Content-Range=bytes 2000070-106786027/106786028 返回的代码也改为206了,而不再是200了。 知道了以上原理,就可以进行断点续传的编程了。 分割文件,多线程下载 使用多线程编程技术,同时启动多个线程,根据线程个数,计算文件分割位置,向服务器发送几个不同的下载断点,同时接受数据并写入文件,就可以实现多线程下载了。 Java实现断点续传的关键几点 (1)用什么方法实现提交RANGE: bytes=2000070-。 当然用最原始的Socket是肯定能完成的,不过那样太费事了,其实Java的net包中提供了这种功能。代码如下: URL url = new URL("http://www.sjtu.edu.cn/down.zip"); HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection(); //设置User-Agent httpConnection.setRequestProperty("User-Agent","NetFox"); //设置断点续传的开始位置 httpConnection.setRequestProperty("RANGE","bytes=2000070"); //获得输入流 InputStream input = httpConnection.getInputStream(); 从输入流中取出的字节流就是down.zip文件从2000070开始的字节流。 大家看,其实断点续传用Java实现起来还是很简单的吧。 接下来要做的事就是怎么保存获得的流到文件中去了。 保存文件采用的方法。 我采用的是IO包中的RandAccessFile类。 操作相当简单,假设从2000070处开始保存文件,代码如下: RandomAccess oSavedFile = new RandomAccessFile("down.zip","rw"); long nPos = 2000070; //定位文件指针到nPos位置 oSavedFile.seek(nPos); byte[] b = new byte[1024]; int nRead; //从输入流中读入字节流,然后写到文件中 while((nRead=input.read(b,0,1024)) > 0) { oSavedFile.write(b,0,nRead); } 怎么样,也很简单吧。 接下来要做的就是整合成一个完整的程序了。包括一系列的线程控制等等。 部分程序原码: import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.tree.*; import javax.swing.border.*; import java.net.*; import java.util.*; import java.io.*; public class TestAnts extends JFrame{ private JMenu file,edit,download,view,option,tool,help; private JMenuItem exit,add,preference,bookmark,helptopic,about; private static JMenuItem start,stop; private JCheckBoxMenuItem istoolbar,isstatusbar; private JMenuBar menubar; private JToolBar toolbar; private JButton addBut,preferenceBut,helpBut,exitBut; private static JButton startBut,stopBut; private JSplitPane leftsp; private JComponent left,right; private JLabel statusbar,label,lUrl,lPath,lName,lNum; public static JTextField tUrl,tPath,tName,tNum; private JPanel panel; private DefaultTreeCellRenderer render; private JScrollPane scrollPane; private JTree tree; public static JProgressBar pb; private Listener listener; private Container contentPane; public TestAnts(String name){ super(name); init(); } public void init(){ listener = new Listener(); //toolbar component add startBut = new JButton("Start"); startBut.setEnabled(false); startBut.setToolTipText("Start"); startBut.addActionListener(listener); stopBut = new JButton("Stop"); stopBut.setEnabled(false); stopBut.setToolTipText("Stop"); stopBut.addActionListener(listener); addBut = new JButton("Add..."); addBut.setToolTipText("Add..."); addBut.addActionListener(listener); preferenceBut = new JButton("Preference..."); preferenceBut.setToolTipText("Preference..."); preferenceBut.addActionListener(listener); helpBut = new JButton("Help"); helpBut.setToolTipText("Help"); helpBut.addActionListener(listener); exitBut = new JButton("Exit"); exitBut.setToolTipText("Exit"); exitBut.addActionListener(listener); toolbar = new JToolBar(); toolbar.add(startBut); toolbar.add(stopBut); toolbar.add(addBut); toolbar.add(preferenceBut); toolbar.addSeparator(); toolbar.add(helpBut); toolbar.addSeparator(); toolbar.add(exitBut); //leftsp component leftsp = new JSplitPane(); leftsp.setContinuousLayout(false); leftsp.setDividerSize(10); leftsp.setDividerLocation(204); left = (JComponent)leftsp.getLeftComponent(); right = (JComponent)leftsp.getRightComponent(); left.setBackground(Color.green); right.setBackground(Color.green); pb = new JProgressBar(0,100); pb.setForeground(Color.red); label = new JLabel("ProgressMonitor.."); lUrl = new JLabel("Download Url:"); lPath = new JLabel("Save To:"); lName = new JLabel("Rename As:"); lNum = new JLabel("Progress Num:"); tUrl = new JTextField(20); tUrl.setEnabled(false); tPath = new JTextField(20); tPath.setEnabled(false); tName = new JTextField(20); tName.setEnabled(false); tNum = new JTextField(20); tNum.setEnabled(false); label.setForeground(Color.blue); panel = new JPanel(); panel.setBackground(Color.green); panel.add(label); panel.add(pb); panel.add(lUrl); panel.add(tUrl); panel.add(lPath); panel.add(tPath); panel.add(lName); panel.add(tName); panel.add(lNum); panel.add(tNum); right.add(panel,BorderLayout.NORTH); render = new DefaultTreeCellRenderer(); render.setBackgroundNonSelectionColor(Color.green); render.setTextNonSelectionColor(Color.blue); render.setTextSelectionColor(Color.red); tree = new JTree(createNodes()); tree.setCellRenderer(render); tree.setBackground(Color.green); scrollPane = new JScrollPane(tree); left.add(scrollPane); //statusbar statusbar = new JLabel("StatusBar"); //menubar file = new JMenu("File"); file.setMnemonic('F'); exit = new JMenuItem("Exit"); exit.setMnemonic('X'); exit.addActionListener(listener); file.add(exit); edit = new JMenu("Edit"); edit.setMnemonic('E'); add = new JMenuItem("Add..."); add.setMnemonic('A'); add.addActionListener(listener); edit.add(add); download = new JMenu("Download"); download.setMnemonic('D'); start = new JMenuItem("Start"); start.setEnabled(false); start.addActionListener(listener); stop = new JMenuItem("Stop"); stop.setEnabled(false); stop.addActionListener(listener); download.add(start); download.add(stop); view = new JMenu("View"); view.setMnemonic('V'); istoolbar = new JCheckBoxMenuItem("ToolBar"); isstatusbar = new JCheckBoxMenuItem("StatusBar"); view.add(istoolbar); view.add(isstatusbar); option = new JMenu("Option"); option.setMnemonic('O'); preference = new JMenuItem("Preference.."); preference.addActionListener(listener); option.add(preference); tool = new JMenu("Tool"); tool.setMnemonic('T'); bookmark = new JMenuItem("Bookmark.."); bookmark.addActionListener(listener); tool.add(bookmark); help = new JMenu("Help"); help.setMnemonic('H'); helptopic = new JMenuItem("Help Topic..."); helptopic.addActionListener(listener); about = new JMenuItem("About..."); about.addActionListener(listener); help.add(helptopic); help.add(about); menubar = new JMenuBar(); menubar.add(file); menubar.add(edit); menubar.add(download); menubar.add(view); menubar.add(option); menubar.add(tool); menubar.add(help); //add all contentPane = getContentPane(); contentPane.add(toolbar,BorderLayout.NORTH); contentPane.add(leftsp,BorderLayout.CENTER); contentPane.add(statusbar,BorderLayout.SOUTH); setJMenuBar(menubar); } public DefaultMutableTreeNode createNodes(){ DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Virtual Folder"); DefaultMutableTreeNode missionState=new DefaultMutableTreeNode("Mission State"); DefaultMutableTreeNode downDate=new DefaultMutableTreeNode("Down Date"); DefaultMutableTreeNode today=new DefaultMutableTreeNode("Today"); DefaultMutableTreeNode yesterday=new DefaultMutableTreeNode("Yesterday"); DefaultMutableTreeNode lastWeek=new DefaultMutableTreeNode("Last Week"); DefaultMutableTreeNode lastWeek3=new DefaultMutableTreeNode("Last Week3"); DefaultMutableTreeNode normal=new DefaultMutableTreeNode("Normal"); DefaultMutableTreeNode running=new DefaultMutableTreeNode("Running"); rootNode.add(missionState); rootNode.add(downDate); downDate.add(today); downDate.add(yesterday); downDate.add(lastWeek); missionState.add(normal); missionState.add(running); return rootNode; } public static void main(String[] args) { TestAnts ta = new TestAnts("网络蚂蚁Ant"); ta.setSize(600,410); ta.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ta.show(); } public static void setStartTrue(){ startBut.setEnabled(true); start.setEnabled(true); } public static void setStartFalse(){ startBut.setEnabled(false); start.setEnabled(false); } public static void setStopTrue(){ startBut.setEnabled(true); start.setEnabled(true); } public static void setStopFalse(){ startBut.setEnabled(false); start.setEnabled(false); } public void showAddDialog(){ AddDialog ad =new AddDialog(this); ad.setSize(380,340); ad.setModal(true); ad.center(); ad.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); ad.show(); } class Listener implements ActionListener{ public void actionPerformed(ActionEvent e){ String arg=e.getActionCommand(); if(arg=="Exit"){ System.exit(0); }else if(arg=="Add..."){ showAddDialog();// }else if(arg=="Start"){ SplitFile sf = new SplitFile(); sf.start(); } } } } 如果想获得JAVA版Ant的原码:http://www.fls-cts.com/kkjvk/
网络蚂蚁java版本(源码及可执行jar文件) 下载的文件跟【网络蚂蚁.jar】放在同一个目录下 【注:本资源系转载,经本人验证可用】 立即下载

相关推荐

js仿照 蚂蚁森林 效果

js仿照 蚂蚁森林 效果 https://blog.youkuaiyun.com/JAVA5G/article/details/99741511?spm=1001.2014.3001.5502

Java HTTP请求

http://www.bitscn.com/java/networkprogram/200605/21356.html“网络蚂蚁”的Java实现    “网络蚂蚁”、Falshget 等许多多线程下载软件都是网友的必备工具,利用这些工具可以快速从服务器上下载比较大的文件,这些工具的工作特性是把服务器端的文件分成几个段,每个段分别、同时进行下载。编写这类程序,第一、必须对HTTP协议有较为充分的了解

学无止境 1373

Windows下快速搭建Kettle开发环境:基于9.4.0.0版本的保姆级教程

本文提供Windows系统下Kettle 9.4.0.0开发环境的详细搭建指南,涵盖源码获取、Maven配置优化、高效编译及部署运行全流程。通过实战验证的步骤和常见问题解决方案,帮助数据工程师快速完成环境配置,提升ETL开发效率。

weixin_28829479的博客 332

用Java制作网络文件下载系统

由于Linux操作系统的兴起和Java语言的日渐成熟,使用Java语言实现一个跨平台的、外观一致的下载工具软件已成为可能。网络蚂蚁是大家非常熟知的下载工具软件,我采用Java语言实现了类似网络蚂蚁的基本功能的软件Jants。本文介绍了一些技术实现要点。 单线程直接获取网络文件 单线程直接获取网络文件的关键点是获取网络文件,以确定基本方法的正确性。它的初始代码的内容比较简单,可以利用HTTP的基本知

angel7532的专栏 1654

Linux安装部署PostgreSQL详细步骤

Linux安装部署PostgreSQL详细步骤

2301_77356579的博客 9323

手把手教你用RoboTwin训练RDT模型:从环境配置到实战微调(避坑指南)

本文提供了一份详尽的避坑指南,手把手教你如何在RoboTwin开源仿真环境中,从零开始配置环境、采集数据并完成RDT视觉语言动作模型的实战微调。文章涵盖了环境搭建、数据流水线构建、模型配置与训练等关键步骤,旨在帮助研究者和开发者高效利用仿真数据,低成本探索具身智能应用。

weixin_29094979的博客 133

Java 网络文件下载

由于Linux操作系统的兴起和Java语言的日渐成熟,使用Java语言实现一个跨平台的、外观一致的下载工具软件已成为可能。网络蚂蚁是大家非常熟知的下载工具软件,我采用Java语言实现了类似网络蚂蚁的基本功能的软件Jants。本文介绍了一些技术实现要点。单线程直接获取网络文件单线程直接获取网络文件的关键点是获取网络文件,以确定基本方法的正确性。它的初始代码的内容比较简

方逸涛的专栏 3196

从平面到立体:一张图看懂MOSFET、FinFET到GAAFET的演变史(附结构对比图)

本文深入解析了半导体晶体管从平面MOSFET到三维FinFET,再到全环绕栅极GAAFET的技术演进历程。通过结构对比图和物理原理分析,揭示了每一次创新如何解决短沟道效应等关键挑战,推动芯片性能提升。特别关注GAAFET作为最新技术突破的架构特点和性能优势。

weixin_30892037的博客 699

回顾那些年的软件霸主,如今依然让人难以忘怀的经典之作

豪杰超级解霸还有千年虫(Y2K)、CCED、FrontPage,听歌必备的千千静听,以前发短信都用飞信,还有那个超神的金山快译,以及南极星乱码转换器。玩过这些的,应该都是70后、80后的老前辈吧哈哈。说起这些软件,真的是一波回忆杀啊。时间飞逝,软件也是换了一批又一批。南极星乱码转换器但这些软件,真的是我们那一代的青春回忆啊,现在想起来都还很清楚呢。

云表平台的博客 607

UDS 诊断 - CommunicationControl(通信控制)(0x28)服务 诊断

字节参数名称字节值#1CommunicationControl(通信控制)请求SID0x28#2#3communicationType(通信类型)#4nodeIdentificationNumer(节点标识符)(高位字节)controlType 为 0x04 或 0x05 时,使用该参数#5nodeIdentificationNumer(节点标识符)(低位字节)controlType 为 0x04 或 0x05 时,使用该参数。

耳朵东金子千的博客 1822

推荐系统(六)双塔模型

双塔模型是推荐场景中常用的粗排模型之一,本节主要介绍几种典型的双塔模型及其变型,如SENet 双塔模型,并联双塔,蒸馏学习,对偶增强双塔,阿里 COLD。

Jin_Kwok的博客 5145

用Java制作网络文件下载系统(chinajava)

由于Linux操作系统的兴起和Java语言的日渐成熟,使用Java语言实现一个跨平台的、外观一致的下载工具软件已成为可能。网络蚂蚁是大家非常熟知的下载工具软件,我采用Java语言实现了类似网络蚂蚁的基本功能的软件Jants。本文介绍了一些技术实现要点。 单线程直接获取网络文件单线程直接获取网络文件的关键点是获取网络文件,以确定基本方法的正确性。它的初始代码的内容比较简单,可以利用HTTP的基本知识

随心世界 2328

Win7 x64位系统下几乎完美使用安装RTX3050 6G显卡驱动详细教程

RTX3050 6G显卡驱动安装指南:由于该显卡发布时间晚于驱动,需手动修改安装文件。首先在NVIDIA官网下载驱动并解压,通过设备管理器获取硬件ID(PCI\VEN_10DE&DEV_2584),然后在解压目录的.inf文件中添加对应的设备标识。安装完成后可能出现设备管理器感叹号问题,推荐通过命令提示符启用测试模式(bcdedit /set testsigning on)解决,此方法无需每次启动按F8,但会显示测试模式水印。文中提供了详细的图文操作步骤和两种解决方案。

m0_67194883的博客 2894

用java实现简单的多线程下载

今天用java写了一个简单的HTTP多线程下载程序,主要用了HTTP协议和RandomAccessFile类来实现。很容易再加上断点续传功能,这样就可以实现类似“小小网络蚂蚁”的功能了。public class DownloadNetTest {    private File fileOut;    private URL url;    private long fileLength=0;

邹鑫的专栏 1938

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

网络蚂蚁 ant 打jar包 通用build.xml配置

                                                                                                                                   -->                                                

*糖果屋*煋光游樂場 3419

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 外企IT精英联袂奉送免费充电圣诞大餐
下一篇: 《Java与模式》选读“原始模型(Prototype)模式”
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值