自己动手,写个Web服务器(Java版)——第二篇、Web服务器0.2

Server.java经过改进,当接收到客户端的请求时,返回一个手工拼接的响应。

代码如下

package mywebserver2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;

/**
 * @author allen
 * @version 0.2
 */
public class Server {
 public static void main(String[] args) {

  StringBuilder responseHead = new StringBuilder();
  StringBuilder responseBody = new StringBuilder();
  // 拼接响应头
  responseHead.append("HTTP/1.1 200 OK");
  responseHead.append("/n");
  responseHead.append("Server: AllenWebServer");
  responseHead.append("/n");

  // 拼接响应体,简单的Html文本
  responseBody.append("<html");
  responseBody.append("<body>Hello This Allen Server/n");
  responseBody.append("</body></html>");
  // 得到相应体的长度。
  int bodylength = responseBody.toString().getBytes().length;

  responseHead.append("Content-Length: " + bodylength);
  responseHead.append("/n");
  responseHead.append("/n");

  System.out.println("响应头是:/n" + responseHead.toString());
  System.out.println("响应体头是:/n" + responseBody.toString());
  System.out.println("********************");

  try {
   ServerSocket ss = new ServerSocket(80);
   Socket s = ss.accept();
   BufferedReader br = new BufferedReader(new InputStreamReader(s
     .getInputStream()));
   String requestLine = "";

   char[] body;
   boolean haveBody = false;
   int length = 0;
   do {
    requestLine = br.readLine();
    System.out.println(requestLine);
    // post方式提交的请求还要取得,请求体的内容
    if (requestLine.startsWith("Content-Length")) {
     StringTokenizer st = new StringTokenizer(requestLine, ":");
     st.nextToken();
     String bodyLength = st.nextToken().trim();
     length = Integer.parseInt(bodyLength);
     haveBody = true;
    }
    if (requestLine.equals("") && haveBody) {
     body = new char[length];
     br.read(body, 0, length);
     System.out.println(new String(body));
    }
   } while (!requestLine.equals(""));
   // 开始响应
   BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s
     .getOutputStream()));
   bw.write(responseHead.toString());
   bw.flush();
   bw.write(responseBody.toString());
   bw.flush();

   br.close();
   s.close();
   ss.close();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   // 资源清理代码
  }
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值