【JavaSe】网络编程篇(四) 使用网络编程模拟B/S服务器

JavaSe·网络编程篇(四) 使用网络编程模拟B/S服务器


1. 分析

模拟服务器端,ServerSocket类监听端口,使用浏览器访问

public static void main(String[] args) throws IOException {
	ServerSocket server = new ServerSocket(8000);
	Socket socket = server.accept();
	InputStream in = socket.getInputStream();
	byte[] bytes = new byte[1024];
	int len = in.read(bytes);
	System.out.println(new String(bytes,0,len));
	socket.close();
	server.close();
}

服务器程序中字节输入流可以读取到浏览器发来的请求信息:
在这里插入图片描述

GET/web/index.html HTTP/1.1是浏览器的请求消息。/web/index.html为浏览器想要请求的服务器端的资源,使用字符串切割方式获取到请求的资源:

//转换流,读取浏览器请求第一行
BufferedReader readWb = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String requst = readWb.readLine();
//取出请求资源的路径
String[] strArr = requst.split(" ");
//去掉web前面的/
String path = strArr[1].substring(1);
System.out.println(path);

2. 案例实现

public static void main(String[] args) throws IOException {
	System.out.println("服务端 启动 , 等待连接 .... ");
	// 创建ServerSocket 对象
	ServerSocket server = new ServerSocket(8888);
	Socket socket = server.accept();
	// 转换流读取浏览器的请求消息
	BufferedReader readWb = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	String requst = readWb.readLine();
	// 取出请求资源的路径
	String[] strArr = requst.split(" ");
	// 去掉web前面的/
	String path = strArr[1].substring(1);
	// 读取客户端请求的资源文件
	FileInputStream fis = new FileInputStream(path);
	byte[] bytes= new byte[1024];
	int len = 0 ;
	// 字节输出流,将文件写会客户端
	OutputStream out = socket.getOutputStream();
	// 写入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());
	while((len = fis.read(bytes))!=1){
		out.write(bytes,0,len);
	}
	fis.close();
	out.close();
	readWb.close();
	socket.close();
	server.close();
}

静态资源加载问题:

浏览器工作原理是遇到图片会开启一个线程进行单独的访问,因此在服务器端加入线程技术:

public static void main(String[] args) throws IOException {
	ServerSocket server = new ServerSocket(8888);
	while(true){
		Socket socket = server.accept();
			new Thread(new Web(socket)).start();
		}
	}
	static class Web implements Runnable{
		private Socket socket;
		public Web(Socket socket){
			this.socket=socket;
		}
		public void run() {
			try{
				//转换流,读取浏览器请求第一行
				BufferedReader readWb = new
				BufferedReader(new InputStreamReader(socket.getInputStream()));
				String requst = readWb.readLine();
				//取出请求资源的路径
				String[] strArr = requst.split(" ");
				System.out.println(Arrays.toString(strArr));
				String path = strArr[1].substring(1);
				System.out.println(path);
				FileInputStream fis = new FileInputStream(path);
				System.out.println(fis);
				byte[] bytes= new byte[1024];
				int len = 0 ;
				//向浏览器 回写数据
				OutputStream out = socket.getOutputStream();
				out.write("HTTP/1.1 200 OK\r\n".getBytes());
				out.write("Content‐Type:text/html\r\n".getBytes());
				out.write("\r\n".getBytes());
				while((len = fis.read(bytes))!=1){
					out.write(bytes,0,len);
				}
				fis.close();
				out.close();
				readWb.close();
				socket.close();
			}catch(Exception ex){
		}
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值