模拟BS服务器分析

模拟网站服务器,使用浏览器访问自己编写的服务端程序,查看网页效果.

服务器要给客户端回写一个信息,回写一个html页面(文件)我们需要读取index.html文件,就必须的知道这个文件的地址?
而这个地址就是请求信息的第一行GET /11_Net/web/index.html HTTP/1.1
可以使用BufferedReader中的方法readLine读取一行InputStream is = socket.getInputStream( );new BufferedReader(new InputStreamReader(is));把网络字节输入流,转为字符缓冲输入流
GET /11_Net/web/index.html HTTP/1.1
可以使用String类的方法split("")切割字符串,获取中间的部分
arr[1]/11_Net/web/index.html
使用String类的方法substring(1),获取html文件的路径11_Net/web/index.html
服务器创建一个本地的字节输入流根据获取到文件路径,读取html文件//写入HTTP协议响应头,固定写法
out.write("HTTP/1.1690 oK irin".getBytes());
out.write("content-Type :text/html\rin" .getBytes( ));//必须要写入空行,否则浏览器不解析
out.write("lrin".getBytes());
服务器端使用网络字节输出流把读取到的文件,写到客户端(浏览器)显示

模拟BSch服务器代码实现

实现步骤:

1.将已存在的静态页面对象放在 项目下
2.创建server套接字
3.实现服务器一直开启的状态
4.开启多线程技术,提高效率

 //创建服务器ServerSocket对象
ServerSocket server = new ServerSocket(8080);
while (true){
//使用accept获取Socket
Socket sc = server.accept(); new Thread(new Runnable() {
@Override
public void run() {
try {
//获取InputStream网络字节输入流
InputStream is = sc.getInputStream(); if (is != null) {
//创建缓冲流 , 转换为字符缓冲输入流
BufferedReader bw = new BufferedReader(new InputStreamReader(is));
//GET /IOTest/web/index.html HTTP/1.1
String line;
line = bw.readLine();
//分割路劲
String[] path = line.split(" ");
//获取路径 IOTest/web/index.html
String filename = path[1].substring(1); //filename = IOTest/web/index.html
System.out.println("filename:" + filename);
//创建本地字节输入流 FileInputStream
FileInputStream fis = new FileInputStream(filename); OutputStream os = sc.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();
sc.close();
} } catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}

最新文章

  1. HDU5795A Simple Nim SG定理
  2. LeetCode Rotate List
  3. 泛函编程(12)-数据流-Stream
  4. 【BZOJ 1019】【SHOI2008】汉诺塔(待定系数法递推)
  5. GitLab使用方法
  6. Spark生态之SparkR
  7. js数组&&字符串&&定时器2
  8. BaseAdapter自定义适配器——思路详解
  9. C++服务器设计(一):基于I/O复用的Reactor模式
  10. ORA-04092: COMMIT 不能在触发器中
  11. 1653: [Usaco2006 Feb]Backward Digit Sums
  12. cassandra的gc调优
  13. SqlSugar ORM 入门篇2 【查询】 让我们实现零SQL
  14. 集成Struts2+Spring+Hibernate_两种方案
  15. 给VMware下的Linux扩展磁盘空间(以CentOS6.3为例)
  16. RocketMQ 集群搭建--双Master方案
  17. Hadoopd 单元测试-MPUnit
  18. 20145322《Java程序设计》第十周学习总结
  19. 用html5(requestFullscreen) js实现点击一个按钮使浏览器全屏效果
  20. Centos----本地yum源制作

热门文章

  1. Windows7下驱动开发与调试体系构建——5.实战反调试标记位(NtGlobalFlag)
  2. 八、Django的组件
  3. JIRA操作之JQL
  4. perl reverse函数
  5. 2022春每日一题:Day 29
  6. .NET二叉树,递归和迭代遍历二叉树
  7. 24、编写一个函数void replace(char *str1,char *str2,int i,int j),将字符串中str1中的第i个字符开始到j个字符结束的位置替换为str2.
  8. 正则表达式之前戏、字符组、量词、特殊符号、贪婪与非贪婪匹配等,python正则模块之re
  9. 写一个linux平台的桌面宠物
  10. Class文件解析