socket实现简单web服务器,可查看http请求信息

    之前看过一些介绍http协议的资料,比如哪个属性是控制什么的这种内容,但是一直都没有一个对http协议直观的感受。现在有时间可以深入理解http协议了。

    这里有一个简单的socket实现的http服务器,该服务器可以查看完整的http的请求信息。

    代码如下:

import java.net.*;
import java.io.*;

/**
 * 一个简单的Socket实现的HTTP响应服务器。
 * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。
 */

public class MService {
	public static void main(String[] args) {
		Socket socket = null;
		try {
			// 创建一个监听8000端口的服务器Socket
			ServerSocket s = new ServerSocket(8000, 3);
			System.out.println("MyWebServer等待来自浏览器的连接\n");
			while (true) {
				socket = s.accept();
				System.out.println("连接已建立。端口号:" + socket.getPort());
				new MyWebServerThread(socket).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

class MyWebServerThread extends Thread {

	private Socket socket;

	MyWebServerThread(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			InputStreamReader is = new InputStreamReader(
					socket.getInputStream());
			char[] bs = new char[2048];
			PrintStream out;
			out = new PrintStream(socket.getOutputStream(), false, "GB2312");
			StringBuilder msg = new StringBuilder();
			// 如果10毫秒还没有数据,则视同没有新的数据了。
			// 因为有Keep-Alive的缘故,浏览器可能不主动断开连接的。
			// 实际应用,会根据协议第一行是GET还是 POST确定。
			socket.setSoTimeout(2000);
			
			// 此处读入请求数据并做相应的处理
			int len = -1;
			try {
				while ((len = is.read(bs)) != -1) {
					System.out.println("len=  "+len);
					msg.append(bs, 0, len);
					msg.append("\n");
				}
			} catch (Exception ex) {
				 ex.printStackTrace();
			}
			// 下面是由服务器直接生成的主页内容
			// 1、首先向浏览器输出响应头信息
			out.println("HTTP/1.1 200 OK");
			out.println("Content-Type:text/html;charset:gb2312");
			out.println();
			// 2、输出主页信息
			out.println("<HTML><BODY>"
					+ "<center>"
					+ "<H1>HTTP协议测试服务器,当前时间:"
					+ new java.util.Date()
					+ "</h1>"
					+ "<form method='get' action='http://127.0.0.1:8000/'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='GET测试'/></form><br/>"
					+ "<form method='post' enctype='text/plain' action='http://127.0.0.1:8000/'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='POST测试'/></form><br/>"
					+ "<form method='post'  enctype='multipart/form-data' action='http://127.0.0.1:8000/'>phototitle:<input type='text' name='phototitle'/>photo:<input type='file' name='photo'/><input type='submit' value='Upload测试'/></form>"
					+ "</center>您提交的数据如下:<pre>" + msg.toString()
					+ "</pre></BODY></HTML>");
			out.flush();
			out.close();
			is.close();
			
			System.out.println("msg.toString()   "+msg.toString());
			System.out.println("close");
			// 关闭连接
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
浏览器里输入:http://127.0.0.1:8000  就可以了。个人感觉:代码不多,内容不少,需要理解,对深入学习http挺有帮助。



  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值