知识大全 用Socket类实现HTTP协议客户端应用

Posted

篇首语:博观而约取,厚积而薄发。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Socket类实现HTTP协议客户端应用相关的知识,希望对你有一定的参考价值。

用Socket类实现HTTP协议客户端应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Http客户端程序已集成在Java语言中 可以通过URLConnection类调用 遗憾的  是 由于SUN没有公布Http客户程序的源码 它实现的细节仍是一个谜 本文根据HTTP  协议规范 用 Socket类实现一个HTTP协议客户端程序      Socket类:  了解TCP/IP协议集通信的读者知道 协议间的通信是通过Socket完成的 在  包中 Socket类就是对Socket的具体实现 它通过连接到主机后 返回一个  I/O流 实现协议间的信息交换      HTTP协议  HTTP协议同其它TCP/IP协议集中的协议一样 是遵循客户/服务器模型工作的 客  户端发往服务端的信息格式如下:     请求方法 URL HTTP协议的版本号  提交的元信息  **空行**  实体     请求方法是对这次连接工作的说明 目前HTTP协议已经发展到 版 它包括GET   HEAD POST DELETE OPTIONS TRACE PUT七种 元信息是关于当前请求的信息 通  过分析元信息 可以检查实体数据是否完整 接收过程是否出错 类型是否匹配等 元  信息的引入使HTTP协议通信更加稳妥可靠 实体是请求的具体内容   将上述报文发往Web服务器 如果成功 应答格式如下:     HTTP协议的版本号 应答状态码 应答状态码说明  接收的元信息  **空行**  实体     以上报文发向客户端 并且接收成功 彼此间关闭连接 完成一次握手   下面用最常用的GET方法 来说明具体的报文应用     GET HTTP/   accept: /source; text/; image/gif; image/jpeg; */*  User_Agent: myAgent  **空行**     这个报文是向主机请求一个缺省HTML文档 客户端HTTP协议版本  号是 版 元信息包括可接收的文件格式 用户代理 每一段之间用回车换行符分  隔 最后以一个空行结束 发向服务器后 如果执行过程正常 服务器返回以下代码:     HTTP/ OK  Date: Tue Sep : : GMT  Server: Apache/   Connection: close  Content Type: text/  **空行**        HTTP/ 表示这个HTTP服务器是 版 是服务器对客户请求的应答状态码 OK  是对应答状态码的解释 之后是这个文档的元信息和文档正文 (相关应答状态码和元  信息的解释请参阅Inetrnet标准草案:RFC )      HTTP客户端程序:    import *;  import java io *;  import java util Properties;  import java util Enumeration;  public class Http   protected Socket client;  protected BufferedOutputStream sender;  protected BufferedInputStream receiver;  protected ByteArrayInputStream byteStream;  protected URL target;  private int responseCode= ;  private String responseMessage= ;  private String serverVersion= ;  private Properties header = new Properties();  public Http()   public Http(String url)   GET(url) ;    /* GET方法根据URL 会请求文件 数据库查询结果 程序运行结果等多种内容 */  public void GET(String url)   try   checkHTTP(url);  openServer(target getHost() target getPort() );  String cmd = GET + getURLFormat(target) + HTTP/ \\r\\n   + getBaseHeads()+ \\r\\n ;  sendMessage(cmd);  receiveMessage();  catch(ProtocolException p)   p printStackTrace();  return;  catch(UnknownHostException e)   e printStackTrace();  return;  catch(IOException i)    i printStackTrace();  return;        /*  * HEAD方法只请求URL的元信息 不包括URL本身 若怀疑本机和服务器上的  * 文件相同 用这个方法检查最快捷有效   */  public void HEAD(String url)   try   checkHTTP(url);  openServer(target getHost() target getPort() );  String cmd = HEAD +getURLFormat(target)+ HTTP/ \\r\\n   +getBaseHeads()+ \\r\\n ;  sendMessage(cmd);  receiveMessage();  catch(ProtocolException p)   p printStackTrace();  return;  catch(UnknownHostException e)   e printStackTrace();  return;  catch(IOException i)    i printStackTrace();  return;      /*  * POST方法是向服务器传送数据 以便服务器做出相应的处理 例如网页上常用的  * 提交表格   */  public void POST(String url String content)   try   checkHTTP(url);  openServer(target getHost() target getPort() );  String cmd = POST + getURLFormat(target) +   HTTP/ \\r\\n +getBaseHeads();  cmd += Content type: application/x form urlencoded\\r\\n ;  cmd += Content length: + content length() + \\r\\n\\r\\n ;  cmd += content+ \\r\\n ;  sendMessage(cmd);  receiveMessage();  catch(ProtocolException p)   p printStackTrace();  return;  catch(UnknownHostException e)   e printStackTrace();  return;  catch(IOException i)    i printStackTrace();  return;        protected void checkHTTP(String url) throws ProtocolException   try   URL target = new URL(url);  if(target==null || !target getProtocol() toUpperCase() equals( HTTP ) )  throw new ProtocolException( 这不是HTTP协议 );  this target = target;  catch(MalformedURLException m)   throw new ProtocolException( 协议格式错误 );      /*  * 与Web服务器连接 若找不到Web服务器 InetAddress会引发UnknownHostException  * 异常 若Socket连接失败 会引发IOException异常   */  protected void openServer(String host int port) throws  UnknownHostException IOException   header clear();  responseMessage= ; responseCode= ;  try   if(client!=null) closeServer();  if(byteStream != null)   byteStream close(); byteStream=null;    InetAddress address = InetAddress getByName(host);  client = new Socket(address port== ? :port);  sender = new BufferedOutputStream(client getOutputStream());  receiver = new BufferedInputStream(client getInputStream());  catch(UnknownHostException u)   throw u;  catch(IOException i)   throw i;      /* 关闭与Web服务器的连接 */  protected void closeServer() throws IOException   if(client==null) return;  try   client close(); sender close(); receiver close();  catch(IOException i)   throw i;    client=null; sender=null; receiver=null;    protected String getURLFormat(URL target)   String spec = // +target getHost();  if(target getPort()!= )  spec+= : +target getPort();  return spec+=target getFile();      /* 向Web服务器传送数据 */  protected void sendMessage(String data) throws IOException  sender write(data getBytes() data length());  sender flush();    /* 接收来自Web服务器的数据 */  protected void receiveMessage() throws IOException  byte data[] = new byte[ ];  int count= ;  int word= ;  // 解析第一行  while( (word=receiver read())!= )   if(word== \\r ||word== \\n )   word=receiver read();  if(word== \\n ) word=receiver read();  break;    if(count == data length) data = addCapacity(data);  data[count++]=(byte)word;    String message = new String(data count);  int mark = message indexOf( );  serverVersion = message substring( mark);  while( mark   responseCode = Integer.parseInt(message.substring(mark+1,mark+=4));  responseMessage = message.substring(mark,message.length()).trim(); cha138/Article/program/Java/hx/201311/25660

相关参考

知识大全 用C#实现HTTP协议下的多线程文件传输

用C#实现HTTP协议下的多线程文件传输  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多人都

知识大全 .NET的socket服务器端框架将支持自定义协议

.NET的socket服务器端框架将支持自定义协议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!近

知识大全 分享socket 客户端-服务器入门代码

  这是从另一个论坛的代码修改的原来有很多错误我已经修改供大家欣赏!  这中间还用到了设计模式中的代理模式还有一些jframe入门的东西  客户端  publicclassJavaClientexte

知识大全 Java Socket多线程服务端、客户端

JavaSocket多线程服务端、客户端  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //主方

知识大全 一个Java 的 Socket 服务器和客户端通信的例子

一个Java的Socket服务器和客户端通信的例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Flex Socket与Java通讯客户端写法

FlexSocket与Java通讯客户端写法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &l

知识大全 Java Socket应答与HTTP服务器的瓜葛

JavaSocket应答与HTTP服务器的瓜葛  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  J

知识大全 socket 线程 思路 java

  网上参考别人的例子改自己的程序终于搞明白了原来在socket的服务器端设置线程并不是像之前想的那样建立一个连接后就重新开一个端口去监听这样的想法遇到了很多问题首先当我把客户端弄成for循环递增的链

知识大全 c#(Socket)同步套接字代码示例

c#(Socket)同步套接字代码示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  同步客户端

知识大全 HTTP协议

JSP总结一:HTTP协议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Http协议由TimB