欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java Socket编写一个简单的Web服务器

程序员文章站 2024-03-20 16:22:22
...

Java Socket编写一个简单的Web服务器

(1)、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象;
(2)、创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求;
(3)、获得浏览器请求,解析资源文件路径;
(4)、读取资源文件,响应给浏览器;
(5)、浏览器地址栏输入: http://localhost:8000/index.html

首先你得创建一个html文件用于返回请求
Java Socket编写一个简单的Web服务器

1、继承Runnable类的代码如下

package TCPhtml;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class HtmlDemo {
    public static void main(String[] args) throws IOException {
        //首先创建套接字,使用ServerSocket监听8888端口
        ServerSocket ss=new ServerSocket(8888);
        while (true){
            //侦听到要连接到此端口的套接字,并且接收它
            Socket socket=ss.accept();
            new Thread(new Runnable() { //开启一个线程
                @Override
                public void run() {
                    InputStream is= null; //初始化字节输入流对象
                    try {
                        is = socket.getInputStream(); //获取套接字的字节输入流对象
                        //将字节输入流读入到字符输入流,并传入字符输入流
                        BufferedReader br=new BufferedReader(new InputStreamReader(is));
                        String line=br.readLine(); //读取字符输入流的字符,每次读取一行
                        System.out.println(line); //这里打印出获得的请求,以便后面查错GET /NETDemo/Web/hello.html HTTP/1.1
                        String[] arr=line.split(" "); //将请求分解成请求方式、请求地址、请求码
                        String htmlpath=arr[1].substring(9); //得到请求的地址的相对地址,以便找到对应的html文件返回
                        FileInputStream fis=new FileInputStream(htmlpath);//找到文件并返回字节输入流对象
                        OutputStream os=socket.getOutputStream(); //获得套接字的字节输出流对象
                        // 写入HTTP协议响应头,固定写法,不写这个会报错
                        os.write("HTTP/1.1 200 OK\r\n".getBytes());
                        os.write("Content-Type:text/html\r\n".getBytes());
                        // 必须要写入空行,否则浏览器不解析
                        os.write("\r\n".getBytes());
                        //读取文件字节,并通过套接字,相当于返回本地文件到浏览器,那边自动解析文件字节输出流
                        int len=0;
                        byte [] bytes=new byte[1024];
                        while ((len=fis.read(bytes))!=-1){
                            os.write(bytes,0,len);
                        }
                        fis.close();
                        socket.close();
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            }).start();
        }


    }
}

然后浏览器输入本机IP地址和端口号,以及文件路径,就可以返回相应的文件内容
Java Socket编写一个简单的Web服务器
2、继承Thread类的

package TCPhtml;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServer extends Thread {
    //首先创建套接字,使用ServerSocket监听8888端口
    ServerSocket serverSocket = new ServerSocket(8888);
    public HttpServer() throws IOException {
    }
    public void run() {//开启一个线程
        while (true) {
            try {
                //侦听到要连接到此端口的套接字,并且接收它
                Socket socket = serverSocket.accept();
                //将字节输入流读入到字符输入流,并传入字符输入流
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String str = bufferedReader.readLine();//读取字符输入流的字符,每次读取一行
                System.out.println(str);//这里打印出获得的请求,以便后面查错GET /NETDemo/Web/hello.html HTTP/1.1
                String path = str.split(" ")[1].substring(9);//将请求分解成请求方式、请求地址、请求码
                FileInputStream fs = new FileInputStream(path);//得到请求的地址的相对地址,以便找到对应的html文件返回
                OutputStream os = socket.getOutputStream();//获得套接字的字节输出流对象
                // 写入HTTP协议响应头,固定写法
                os.write("HTTP/1.1 200 OK\r\n".getBytes());
                os.write("Content-Type:text/html\r\n".getBytes());
                // 必须要写入空行,否则浏览器不解析
                os.write("\r\n".getBytes());
                //读取文件字节,并通过套接字,相当于返回本地文件到浏览器,那边自动解析文件字节输出流
                int len = 0;
                byte[] bytes = new byte[1024];
                while ((len = fs.read(bytes)) != -1) {
                    os.write(bytes, 0, len);
                }
                fs.close();
                os.close();
                socket.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    static class Start {
        public static void main(String[] args) throws IOException {
            HttpServer httpServer = new HttpServer();//创建HttpServer对象
            httpServer.start(); //开启线程
        }
    }
}