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

之前看过一些介绍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 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值