Java 怎么操作常用的网络协议有哪些的

问说网手机版
躺着 站着 跪着轻松访问
问说网 / 蜀ICP备号
感谢您对问说网的支持,提出您在使用过程中遇到的问题或宝贵建议,您的反馈对我们产品的完善有很大帮助。
您的反馈我们已收到!
感谢您提供的宝贵意见,我们会在1-2个工作日,通过您留下的联系方式将处理结果反馈给您!用java实现基于http协议的网络文件下载
基于HTTP的协议的网络文件下载,工作原理建立在请求/响应模式(Request/Response)上:一个客户端与服务器建立连接后,客户端向Web服务器发出一个HTTP请求行;Web服务器在收到有效的请求后,返回一个状态行或多个响应标题、一个空白行和相关文档。HTTP协议使用的端口号,通常为80。开发基于http协议的网络文件下载必须掌握HTTP协议,包括向服务器发送请求和获取服务器响应状态的过程。HTTP1.0协议不支持断点续传功能. 本文用java提供了一个简单的实现.
1.HTTP协议工作方式
&&& 基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、获取服务器响应状态、关闭连接。其中较为复杂的过程是:发送请求信息、获取服务器响应状态.
1)向服务器发送请求信息&
  一个HTTP请求由一个请求行、可选数目的请求标题、一个空白行,以及在POST情况下的一些额外的数据组成。请求行的格式是:
&&&& Method Request-URI HTTP-Vsersion CRLF
&&&&& Method表示请求方法,如GET和POST
&&&&& Request-URI标识了要请求的资源,
&&&&& HTTP-Version表示请求的HTTP协议版本,
&&&&& CRLF表示回车换行。
&&&& HTTP请求报文格式如下:
&&&&&&& HTTP Command:&&&&&& //方法字段(GET方法,POST方法)
&&&&&&& URI:&&&&&&&&&&&&&&& //URL字段,发送请求至保存该网站的服务器。
&&&&&&& HTTP Version:&&&&&& //http协议版本字段
&&&&&&& Accept:&&&&&&&&&&&& //指示可被接受的请求回应的介质类型范围列表。
&&&&&&& Accept-Language:&&& //限制了请求回应中首选的语言为简体中文,否则使用默认值。
&&&&&&& Accept-Encoding:&&& //限制了回应中可接受的内容编码值
&&&&&&& User-Agent:&&&&&&&& //定义用户代理,即发送请求的类型
&&&&&&& Host:&&&&&&&&&&&&&& //定义了目标所在的主机
&&&&&&& Connection:&&&&&&&& //告诉服务器使用连接类型
2)获取服务器响应状态&
  在发送HTTP请求行以后,程序就可以读取服务器的响应状态了。HTTP响应状态行包括:HTTP 状态码和一些HTTP响应标题。&
  HTTP回应报文
&&&&&&& HTTP Version: HTTP/1.1&&&&&& //服务器用的是HTTP/1.1版本
&&&&&&& HTTP Status: 200&&&&&&&&&&&& //请求成功,信息可以读取,包含在响应的报文中
&&&&&&& Date:&&&&&&&&&&&&&&&&&&&&&&& //响应报文的时间
&&&&&&& Server:&&&&&&&&&&&&&&&&&&&&& //响应报文的服务器
&&&&&&& X-Powered-By:&&&&&&&&&&&&&&& //表明运行环境
&&&&&&& Set- cookie:&&&&&&&&&&&&&&&& //
&&&&&&& Vary:&&&&&&&&&&&&&&&&&&&&&&& //&
&&&&&&& Content-Length:&&&&&&&&&&&& //表明实体的长度
&&&&&&& Connection:&&&&&&&&&&&&&&&& //告诉客户机在报文发送完毕后连接的状态
&&&&&&& Content-Type:&&&&&&&&&&&&& //表明实体中的对象类型(html文档)
&&&&&&& Binary Data:&&&&&&&&&&&&& //二进制数据
状态码表示响应类型,常用的有:
1&&  保留
2&&  表示请求成功地接收
3&&  为完成请求客户需进一步细化请求
4&&  客户错误
5&&  服务器错误
  在程序中间,如果读到&HTTP/1.1 200 OK&这样的字符串,表明欲下载文件存在、该服务器支持断点续传,可以使用多线程下载。如果读到&HTTP/1.0 200 OK&这样的字符串,表明欲下载文件存在、但该服务器不支持断点续传,只可以使用单线程下载。
2.实现代码
import java.io.IOE&&&&
import java.io.InputS&&&&
import java.io.RandomAccessF&&&&
import java.net.HttpURLC&&&&
import java.net.URL;&&&&
public class TestDownFile {&&&&
&public static void main(String[] args){&&&&
& String sURL =&&;&&&&
& int nStartPos=0;&&&&
& int nRead=0;&&&&
& String sName=&book.rar&;&&&&
& String sPath=&e:\\temp&;&&&&
& try {&&&&
&& URL url = new URL(sURL);&&&&
& //打开连接&&&&
&& HttpURLConnection httpConnection = (HttpURLConnection) url&&&&
&&&& .openConnection();&&&&
&&& //获得文件长度&&&&
&& long nEndPos =getFileSize(sURL);&&&&
&& RandomAccessFile oSavedFile= new RandomAccessFile(sPath+&, &rw&);&&&&
&& httpConnection.setRequestProperty(&User-Agent&, &Internet Explorer&);&&&&
&& String sProperty = &bytes=& + nStartPos + &-&;&&&&
&&& //告诉服务器book.rar这个文件从nStartPos字节开始传&&&&
&& httpConnection.setRequestProperty(&RANGE&, sProperty);&&&&
&& System.out.println(sProperty);&&&&
&& InputStream input = httpConnection.getInputStream();&&&&
&& byte[] b = new byte[1024];&&&&
&& //读取网络文件,写入指定的文件中&&&&
&& while ((nRead = input.read(b, 0, 1024)) & 0&&&
&&&& && nStartPos & nEndPos ) {&&&&
&&& oSavedFile.write(b, 0, nRead);&&&&
&&& nStartPos += nR&&&&
&& httpConnection.disconnect();&&&&
& } catch (Exception e) {&&&&
&& e.printStackTrace();&&&&
//& 获得文件长度&&&&
&public static long getFileSize(String sURL) {&&&&
& int nFileLength = -1;&&&&
& try {&&&&
&& URL url = new URL(sURL);&&&&
&& HttpURLConnection httpConnection = (HttpURLConnection) url&&&&
&&&& .openConnection();&&&&
&& httpConnection.setRequestProperty(&User-Agent&, &Internet Explorer&);&&&&
&& int responseCode = httpConnection.getResponseCode();&&&&
&& if (responseCode &= 400) {&&&&
&&& System.err.println(&Error Code : & + responseCode);&&&&
&&& return -2; // -2 represent access is error&&&&
&& String sH&&&&
&& for (int i = 1;; i++) {&&&&
&&& sHeader = httpConnection.getHeaderFieldKey(i);&&&&
&&& if (sHeader != null) {&&&&
&&&& if (sHeader.equals(&Content-Length&)) {&&&&
&&&&& nFileLength = Integer.parseInt(httpConnection&&&&
&&&&&&& .getHeaderField(sHeader));&&&&
&&&& }&&&&
&&& } else&&&
& } catch (IOException e) {&&&&
&& e.printStackTrace();&&&&
& } catch (Exception e) {&&&&
&& e.printStackTrace();&&&&
& System.out.println(nFileLength);&&&&
& return nFileL&&&&
作者&海纳百川,有容乃大&博客分类:
最近在做一些开放接口应用的时候发现原有的一些应用大量使用了HttpComponent里面的功能。从HttpComponent本身的介绍来说,它是一个实现Http协议很多操作功能的组件,在一些爬虫和网络应用开发中都得到大量的应用。因为牵涉到的开放服务接口使用的是http rest服务,感觉httpcomponent很适合其中的场景。这里结合项目中使用的一些场景来对其中的功能做一个简单的总结。
HttpClient基本操作
在使用httpclient之前我们需要首先下载httpclient的jar包,里面就包含了httpclient.jar, httpcore.jar等几个文件。我们先看一个简单的示例:
import java.io.BufferedR
import java.io.IOE
import java.io.InputStreamR
import org.apache.http.HttpR
import org.apache.http.client.ClientProtocolE
import org.apache.http.client.HttpC
import org.apache.http.client.methods.HttpG
import org.apache.http.impl.client.DefaultHttpC
public class HTTPGetSample {
public static void main(String[] args) throws ClientProtocolException, IOException {
String url = ".hk/search?q=httpClient";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
System.out.println("Response Code: " +
response.getStatusLine().getStatusCode());
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
String line = "";
while((line = rd.readLine()) != null) {
System.out.println(line);
在这个示例里我们尝试用httpclient发送一个http get请求。请求的地址是对应到一个google search的url.仔细看上面的代码,其实还是很简单,首先创建一个HttpClient的对象,然后针对我们的http get操作创建一个HttpGet对象,并将请求url作为参数传给该对象。具体执行get操作的步骤是通过httpclient.execute()方法。这个方法里将HttpGet对象作为参数传入。返回一个HttpResponse的结果。
我们通过读取HttpResponse的结果就可以得到请求返回的详细信息。这个过程和我们通过浏览器浏览某个网页的效果相同。程序执行的部分结果如下:
Response Code: 200
&!doctype html&&html itemscope="itemscope" itemtype="http://schema.org/WebPage"&&head&&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&...
由于篇幅限制,省略了部分结果。
从前面示例里我们可以看到通过HttpClient发送Http请求的基本套路:
1. 创建HttpClient对象。
2. 构造Http 请求对象。
3. 执行HttpClient对象的execute方法,将Http请求对象作为该方法的参数。
4. 读取execute方法返回的HttpResponse结果并解析。
ok,既然整体过程是这样的话,我们后续使用post, put, delete等操作的过程也就大同小异了。在详细讨论这些方法使用之前我们先简单的讨论一下http协议里的这几种方法。
Http协议常用方法
关于http协议的介绍网上材料很多。总的来说,http协议规范了通信双方交互的方式,基本上它是采用一种请求-应答的方式。客户端发送请求给服务器端,然后服务器端发送响应回来。我们常用的几种http操作的方法可以分为可修改的和不可修改的。怎么理解这个可修改和不可修改的意思呢?
在http协议里,我们有的请求方法只是获取服务器端资源的信息,默认的假定是不修改服务器端的状态,这种方法称为不可修改的方法。比如说HttpGet, HttpHead, HttpOptions,HttpTrace。所以说这种请求方法是可以重复执行并返回相同结果的。我们对同一个资源执行若干次get操作,每次得到的结果都相同。而对于可修改的请求来说,主要有HttpPut, HttpPost, HttpDelete等。他们在规范里分别对应着对资源的update, create和delete等操作。所以在一些web应用里,我们提交表单的时候选择的是http post操作。
除了http协议里规定的这么几种方法,它本身还支持交互的内容,比如通过请求头中间设定"accept", "Content-Type"等信息,指定我们交互的内容格式。他们可以是静态文件类型的,比如说txt, .gif,.jpg等,也可以是一些其他文本如json, xml。在一些rest web服务里面,我们指定的支持json或者xml格式的数据交换就可以通过这里来定义。
我们刚看到了通过设定请求头来指定通信的交互内容格式,那么是否也可以指定请求体呢?在这里是有可能的,只是针对不同的请求方法。比如说对HttpGet之类的方法,他们本身只是获取服务器的内容不需要向服务器提交额外的信息,所以对于这一类的请求方法来说带个请求体意义并不大。而对于那些要提交大量内容给服务器的请求如上传文件或者提交表单信息的httpput, httppost请求,他们就有必要设置一个请求体。
有了前面的这些铺垫,我们后面可以更加深入的分析一下httpclient中间几种方法的结构和用法。
Http操作方法结构
HttpClient相关的uml结构图如下:
我们关注的各种http方法都被定义成一个个独立的类,他们都继承自HttpRequestBase。其中比较特殊一点的是HttpPut, HttpPost,他们继承自HttpEntityEnclosingRequestBase。为什么这两个类要稍微特殊一点呢?这就是我们前面提到的他们要设置请求体,在HttpEntityEnclosingRequestBase里有HttpEntity的成员变量,他们作为这两个方法特定的特性定义在这里:
private HttpE
public HttpEntity getEntity() {
return this.
public void setEntity(final HttpEntity entity) {
this.entity =
HttpEntity是一个接口,根据具体传入的参数类型我们可以选择StringEntity, InputStreamEntity等。由此,对于这两种有差别的请求方法来说,他们只是需要多增加一个setEntity的方法。
另外对于通用的设置请求头部分,前面的示例代码里我们是使用了一种硬编码的方式。我们也可以采用request.addHeader(Header)的方法。在HttpClient里,Header是一个接口,我们可以创建两种实现该接口的对象来作为参数传给addHeader方法。分别是BasicHeader, BufferedHeader。
HttpClient通常用来作为一个模拟http请求的工具。我们最常见的get, put, post, delete等方法在其中都通过具体定义的类来实现。当我们要发送某个具体的请求是,只需要创建对应请求的对象并设定请求头或者请求体,执行HttpClient的execute方法就可以得到执行结果了。返回的HttpResponse消息体结果具体内容是一个InputStream,我们可以根据需要来读取内容。返回的消息头则是显示http操作方法的执行结果,我们可以根据消息头来判断请求执行是否正确,结果是否执行完毕以及如果出错了错误的缘由可能是什么等信息。关于HttpClient的更多实现和应用后面会进一步学习研究。
浏览 48894
可以参考代码:java apache commons HttpClient发送get和post请求的学习整理,下载地址:他这边贴出来的代码有点老了,新的httpcomponent的api有不少更新,不过整体的思路都差不多。
浏览: 1008473 次
来自: 北京
di1984HIT 写道xuexile~hahaha~
讲的很详细,感谢
while(i & a.length)
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Java网络编程 - 男儿当自强 - CSDN博客
Java网络编程
Ip地址&&InetAddress类
InetAddress&ia&=&InetAddress.getLocalHost();
InetAddress&ia&=&InetAddress.getByName(&&);
InetAddress[]&ias&=&InetAddress.getAllByName(&&);
System.out.println(ia.getHostAddress());//
UDP协议&:面向无连接
1、将数据及源和目的封装成数据包中,不需要建立连接
2、每个数据包的大小限制在内
3、因无连接,所以是不可靠协议
4、不需要建立连接,速度快
TCP协议&:&面向连接
1、建立连接,形成传输数据的通道
2、在连接中进行大数据量传输
3、通过三次握手完成连接,是可靠协议
4、必须建立连接,效率会稍低
网络编程比较重要的类
1、socket就是为网络服务提供的一种机制
2、通信的两端都有
3、网络通信其实就是通信
4、数据在两个间通过传输
发送需求:通过UDP传输方式,将一段文字数据发送出去
&&1、建立UDPSocket服务
&&2、提供数据,并将数据封装到数据包中
&&3、通过socket服务的发送功能,将数据包发送出去
&&4、关闭资源
接收需求:定义一个应用程序,用于接收UDP协议传输的数据
&&1、定义udpsocket服务。定义接收端的时候,通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识
&&2、定义一个数据包,因为要存储接收到的字节数据。
&&因为数据包对象中有更多功能可以提取字节数据中的不同信息。
&&3、通过socket服务的receive方法将接收到的数据存入定义好的数据包中
&&4、通过数据包对象的特有功能。将这些不同的数据取出。
&&5、关闭资源
1、Socket和
2、建立客户端和服务器端
3、建立连接后,通过中的流进行数据的传输
同意,客户端与服务器端是两个独立的应用程序
当客户端跟服务端建立连接后,则输入、输出流就已经创建成功
&*&通过查阅socket对象,发现在建立对象是,就可以去连接指定主机
&*&因为tcp是面向连接的,所以&在建立socket服务时,形成通路后,在该同道进行数据的传输
&*&1、创建socket服务对象,并指定要连接的主机和端口
&*&2、获取socket流中的输出流,将数据写入到该流中,通过网络发送给服务器端
*&3、获取socket流中的输入流,将服务器端反馈的数据获取到
&*&1、建立服务端的socket端口,serverSocket(Port)&&监听端口
&*&2、获取连接过来的客户端对象
&*&通过serverSocket的&&accept()方法。所以这个方法阻塞式的。没有连接就会等。
&*&3、客户端如果发送过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端的读取发过来的数据
&*&4、关闭(一般服务器是不关闭的)
TCP文本传输需要注意的是
一、如果传输的是文本内容&,&就直接用Reader/Writer&体系比较方便
二、如果传输的是其他文件内容:InputStream/OutputStream。需要注意的问题如下:
1、如果操作的是基本数据类型,可以使用DataInputStream/&DataOutputStream&来操作
2、如果使用了带缓存的流,则必须要记住要flash(),将流中的数据强行写入服务器中的读取流
3、当客户端把文件内容全部写入到网络流中后,就要关闭网络写入流,方法:socket.shutdownOutput();同理服务器端读取完文件内容后,也必须关闭读取客户端的方法:socket.shutdownInput();。如果不关闭,则服务器端一直会等待到结尾位置
4、服务器端流关闭顺序:跟文件相关的资源先关闭,然后关socket.close()。最后是serverScoket.close();
URLConnection &、 URL & 、 SocketAddress&也是比较重要的类
封装了解析地址的类
能直接获取&、、&资源路径
URLConnection类
封装了请求、响应的信息
可以获取响应的流,也可以获取发送流
URL&url&=&new&URL(path);
URLConnection&con&=&url.openConnection();
InputStream&in&=&con.getInputStream();//其实就是获取Socket对象的方法
OutputStream&out&=&con.getOutputStream();
SocketAddress 类
其子类:InetSocketAddress&,&类实现&IP&套接字地址(IP&地址&+&端口号)。
封装了IP&&和&端口 &
相关文章推荐

我要回帖

更多关于 常用的网络协议有哪些 的文章

 

随机推荐