package BsServersocket;

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

 public class Client {
 /**
  * 模拟BS服务器:
  * 创建BS版本的TCP服务器
  *
  * //1.创建服务器ServerSocket,和系统要指定的端口号
  * //2.使用accept获取到请求的客户端对象(浏览器)
  * //3.使用Socket对下个中的getInputStream,获取到网络字节输入流InputStream对象
  * //4.使用网络字节输入流InputStream对象中的方法read获取客户端的请求信息
  * http://127.0.0.1:8080/文件目录
  * 服务器需要给客户端回写一个html页面(文件)
  * 我们需要读取index_html文件,就必须知道这个文件的地址
  * 这个文件的地址就是请求信息的第一行
  * 可以使用BufferedReader中的方法readLine读取一行
  * new BufferedReader(new InputStreamReader(is)把网络字节输入流转为字符缓冲输入流
  * 使用String类的方法split根据空格切割字符串获取中间部分
  * 使用String的方法subString(1)截取字符串获取到html文件路径
  * 服务器创建本地字节输入流根据获取到的文件路径读取html文件
  * 注意:
  *  写出时先固定写:
  *      //写入HTTP协议响应,固定方法
  *      out.write("HTTP/1.1 200 ok、\r\n".getBytes());
  *      out.write("Content-Type:text/html\r\n".getBytes());
  *      //必须要写入空行,否则浏览器不解析
  *      out.write("\r\n".getBytes());
  * 服务器端使用网络字节输出流把读取到的文件写到客户端
  *不显示图片:
  *  浏览器解析服务器回写的html页面,页面中如果有图片,那么浏览器就会单独在开启一个线程,读取服务器图片
  *  让服务器一直处于监听状态(while)
  *  使用线程
  *
  */

 public static void main(String[] args) throws IOException {
 //1.创建服务器ServerSocket,和系统要指定的端口号
     ServerSocket serverSocket = new ServerSocket(8080);
 //使用while循环让服务器一直跑
     while (true) {
         //2.使用accept获取到请求的客户端对象(浏览器)
         Socket socket = serverSocket.accept();
 //开启线程
 new Thread(new Runnable() {
     @Override
     public void run() {
         try{
             //3.使用Socket对下个中的getInputStream,获取到网络字节输入流InputStream对象
             InputStream is = socket.getInputStream();
 //4.使用网络字节输入流InputStream对象中的方法read获取客户端的请求信息
 /*byte[] bytes = new byte[1024];
     int len = is.read(bytes);
     String str = new String(bytes);*/
             //使用BufferedReader把网络字节输入流转换为缓冲输入流读取第一行
             BufferedReader br = new BufferedReader(new InputStreamReader(is));
             String s = br.readLine();
             //使用String类的split方法切割得到文件路径
             String[] s1 = s.split(" ");
             //使用String类的subString方法截取
             String htmlpath = s1[1].substring(1);
             //服务器创建本地字节输入流根据获取到的文件路径读取html文件
             FileInputStream fis = new FileInputStream(htmlpath);
             //务器端使用网络字节输出流把读取到的文件写到客户端
             OutputStream ous = socket.getOutputStream();
             //出时先固定写
             //写入HTTP协议响应,固定方法
             ous.write("HTTP/1.1 200 ok、\r\n".getBytes());
             ous.write("Content-Type:text/html\r\n".getBytes());
             //必须要写入空行,否则浏览器不解析
             ous.write("\r\n".getBytes());
             //一读一写回写
             int len = 0;
             byte[] bytes = new byte[1024];
             while ((len = fis.read(bytes)) != -1) {
                 ous.write(bytes, 0, len);
             }
             fis.close();
             socket.close();
         }catch (IOException e){
             e.printStackTrace();
         }

     }
 }).start();

     }

 }
 }

最新文章

  1. python之浅拷贝和深拷贝
  2. B-index、bitmap-index、text-index使用场景详解
  3. 几个容易被忽略的mysql知识
  4. http statusCode(状态码)
  5. android 镜像源
  6. maven 启动 报错 Fatal error compiling: 无效的目标发行版
  7. JavaScript高级编程(一)
  8. about云资源共享
  9. Visual Studio Solution Configuration
  10. Fiddler 抓包 教程
  11. 【USACO 1.5.4】跳棋的挑战
  12. 逐步在Windows上结合CopSSH + msysGit安装安装Git Server同时集成Git使用Visual Studio
  13. 聊聊click延迟和点击穿透
  14. 解决liblzo2.so缺失
  15. Masonry框架源码深度解析
  16. Learning ROS for Robotics Programming Second Edition学习笔记(九) indigo Gazebo rviz slam navigation
  17. 关于word-break和word-wrap的使用和区别
  18. hinernate-实体对象的3种状态
  19. 老男孩python学习自修第四天【字典的使用】
  20. Sqlserver脚本创建登录名密码

热门文章

  1. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info
  2. NX二次开发-NXOPEN自动切换到工程图模块
  3. Wannafly挑战赛21-A-灯塔-内含正确的凸包模版
  4. 3.RabbitMQ 第一个程序
  5. Area--->AreaRegistrationContext.MapRoute
  6. taskFactory
  7. 拾遗:Git 基础
  8. PostGIS 通过SQL语句实现空间分析【入门级】
  9. 用Jquery写返回顶部代码
  10. 40. 组合总和 II