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