基于Jave的Web服务工作机制(2)

网络整理 - 07-26

HTTP响应(Responses)

 

  和请求类似,一个HTTP响应也包含三个部分:

  协议状态 代码描叙(Protocol-Status code-Description)
  响应包头(Response headers)
  实体(Entity body)
  下面是HTTP响应的一个简单范例:

  HTTP/1.1 200 OK
  Server: Microsoft-IIS/4.0
  Date: Mon, 3 Jan 1998 13:13:33 GMT
  Content-Type: text/html
  Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
  Content-Length: 112

  <html>
  <head>
  <title>HTTP Response Example</title></head><body>
  Welcome to Brainy Software
  </body>
  </html>

  第一行的响应包头和上面的请求包头很相似。 第一行告诉我们,协议是使用的HTTP1.1,响应请求已成功(200表示成功),一切已OK。

  响应包头和请求包头相似,也包含一些有用的信息。响应的实体是HTML那一部分的内容。包头和实体也都是被CRLF序列分离开的。

  Socket类

  套接字(socket)是网络连接的一个端点。它使得应用程序能够通过网络进行读和写的操作。 通过在连接上发送和接受字节流,两个位于不同计算机的软件程序能够彼此相互通讯。为了发送一个消息到另一个程序,你需要知道对方机器的IP地址和socket端口号。在JAVA中,一个socket是由java.net.Socket类所表示的。

  为了创建一个套接字,你可以使用Socket类的构造函数来完成。 这些构造函数接受主机名和端口:

  public Socket(String host, int port)
  host表示远程计算机名或者IP地址,port表示该远程应用的端口号。比如,要在80端口连接到yahoo.com,你需要构造下面的socket:

  new Socket("yahoo.com", 80);
  一旦你成功创建了一个Socket类的实例,就可以使用它来发送和接受字节流了。 要发送字节流,必须首先调用Socket类的getOutputStream 方法来获得一个java.io.OutputStream对象。要发送一个文本到远程应用程序,经常要构造一个从OutputStream对象返回的java.io.PrintWriter对象。要接收连接另一端的字节流,要调用Socket类的getInputStream方法,该方法是从 java.io.InputStream返回的。

  下面的程序段创建了一个socket,和本地HTTP服务器(127.0.0.1代表本地)进行通讯,发送一个HTTP请求,然后从服务器接收一个响应。它创建了一个StringBuffer 来保存响应,并将它打印到控制台。

  Socket socket  = new Socket("127.0.0.1", "8080");
  OutputStream os = socket.getOutputStream();
  boolean autoflush = true;
  PrintWriter out = new PrintWriter( socket.getOutputStream(), autoflush );
  BufferedReader in = new BufferedReader(
  new InputStreamReader( socket.getInputStream() ));

  // send an HTTP request to the web server
  out.println("GET /index.jsp HTTP/1.1");
  out.println("Host: localhost:8080");
  out.println("Connection: Close");
  out.println();

  // read the response
  boolean loop  = true;
  StringBuffer sb = new StringBuffer(8096);

  while (loop) {
  if ( in.ready() ) {
    int i=0;
    while (i!=-1) {
      i = in.read();
      sb.append((char) i);
    }
    loop = false;
  }
  Thread.currentThread().sleep(50);
}

  // display the response to the out console
  System.out.println(sb.toString());
  socket.close();

  要从服务器得到一个确切的响应,你需要发送一个遵循HTTP协议规则的HTTP请求。如果你阅读了上面的那段"超文本传输协议(HTTP)" ,那么你就应该能够理解刚才上面建立socket的代码。