黑马程序员技术交流社区

标题: 这样就可以通过浏览器访问客户端了 [打印本页]

作者: lipy1993    时间: 2016-3-27 22:00
标题: 这样就可以通过浏览器访问客户端了
public class ServerRunnable implements Runnable {
        //定义Socket对象,用于在构造方法中接受对应的Socket对象
        private Socket socket;
        public ServerRunnable(Socket socket){
                this.socket=socket;
        }
       
        //重写该线程执行目标的run方法
        @Override
        public void run() {
        try{
                //客户端输入字节流包装为字符输入流,方便读取客户端请求消息
BufferedReader bfr = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
                        //读取客户端请求消息头,包括请求方式  协议版本  请求路径
                        String line = bfr.readLine();
                        //按照1-N个空格方式切割请求消息头,直接获取请求路径
                        String[] str = line.split(" +");
                        //数组索引1是请求路径, 调用substring去掉路径开始的 斜杠(/)
                        String path = str[1].substring(1);
                        //将客户端请求的路径封装为服务器端的File对象
                        File file = new File(path);
                        //字节流读取客户端请求的服务器端的文件
                        FileInputStream fis = new FileInputStream(file);
                        //获取Socket输出流,用于为客户端响应
                        OutputStream out = socket.getOutputStream();
                        //输出http响应头,否则有些浏览器会将html解析为普通文本,没有网页的效果了
                        out.write("HTTP/1.1 200 OK\r\n".getBytes());
                        out.write("Server: Apache-Tomcat\r\n".getBytes());
                        out.write(("Date: "+new Date().toString()+"\r\n").getBytes());
                        //输出消息头和html正文之间的空行
                        out.write("\r\n".getBytes());  
                        //请求的html文件,响应给客户端浏览器
                        byte[] bytes = new byte[1024];
                        int len = 0 ;
                        while((len = fis.read(bytes))!=-1){
                                out.write(bytes, 0, len);
                        }
                        socket.close();
        } catch (Exception ex){
                ex.printStackTrace();
        }
        }
}

完成服务器端代码
public class WebServer {
        public static void main(String[] args) throws Exception{
                //创建线程池提供线程
                ExecutorService threadPool = Executors.newFixedThreadPool(50);
                //创建ServerSocket服务,监听8080端口
                ServerSocket server = new ServerSocket(8080);
                while(true){
                        //获取客户端连接
                        Socket s = server.accept();
                        //分配线程提交任务执行
                        threadPool.submit(new ServerRunnable(s));
                }
        }
}

作者: and2long    时间: 2016-3-27 22:06
注释很详细,学习了...
作者: weishixiong    时间: 2016-3-27 22:11
666666666666666666666666666




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2