之前看过一些介绍http协议的资料,比如哪个属性是控制什么的这种内容,但是一直都没有一个对http协议直观的感受。现在有时间可以深入理解http协议了。
这里有一个简单的socket实现的http服务器,该服务器可以查看完整的http的请求信息。
代码如下:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
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.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挺有帮助。
原文:https://blog.csdn.net/bingospunky/article/details/39449761