public static void main(String[] args) throws IOException {
// 创建一个服务器ServerSocket并和系统要指定的端口号
ServerSocket server = new ServerSocket(5588);
/*
浏览器解析服务器回写的html页面,页面中如果有图片,那么浏览器就会单独的开启一个线程,读取服务器的图片,所以就得让
服务器一直处于监听状态,客户端请求一次,服务器就回写一次
*/
while (true) {
// 使用accept方法获取到请求的客户端对象(浏览器)
Socket socket = server.accept();
// 开启线程
new Thread(new Runnable() {
@Override
public void run() {
BufferedReader br = null;
FileInputStream fis = null;
try {
// 使用socket中的方法getInputStream,获取网络字节输入流对象InputStream
InputStream is = socket.getInputStream();
// 把is网络字节输入流对象转换为字符缓冲输入流
br = new BufferedReader(new InputStreamReader(is));
// 把客户端请求信息行第一行数据读取出来 GET /baidu/baidu.html HTTP/1.1
String s = br.readLine();
// 把读取的数据进行切割,只要中间的部分 /baidu/baidu.html
String[] arr = s.split(" ");
// 把路径前边的/去掉,进行截取 baidu/baidu.html
String fileName = arr[1].substring(1);
System.out.println("文件名称" + fileName);
// 创建本地字节输入流,构造方法中绑定要读取的html路径
fis = new FileInputStream(fileName);
// 使用socket中的方法getOutputStream,获取网络字节输入流对象OutputStream
OutputStream os = socket.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());
// 一读一写复制文件,把服务器读取的html文件回写到客户端
int len = 0;
byte[] b = new byte[1024];
while ((len = fis.read(b)) != -1) {
os.write(b, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 释放资源
try {
socket.close();
if (br != null) {
br.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException | NullPointerException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
简单实现B/S服务器
最新推荐文章于 2023-04-17 13:44:35 发布