今天我们介绍一下,我们经常用浏览器访问的网站,他的服务器工作原理是什么.
我们用浏览器访问网站,一般用的是http协议.底层用的是IP/TCP协议.我们通过写一个服务器的Demo来解释一个服务器的工作原理.
[AppleScript] 纯文本查看 复制代码
ServerSocket server = new ServerSocket(8080);
while(true){
//使用accept方法获取到请求的客户端对象(浏览器)
Socket socket = server.accept();
new Thread(new Runnable() {
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
System.out.println(line);
String[] arr = line.split(" ");
String htmlpath = arr[1].substring(1);
FileInputStream fis = new FileInputStream(htmlpath);
OutputStream os = socket.getOutputStream();
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[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
//释放资源
fis.close();
socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
//server.close();
}
先说为什么要用死循环,因为浏览器解析服务器回写的html页面,页面中如果有图片,那么浏览器就会单独的开启一个线程,读取服务器的图片
我们就的让服务器一直处于监听状态,客户端请求一次,服务器就回写一次.因为用的是http协议.所以往浏览器回写静态网页的时候一定要带上http的响应头信息.,
[AppleScript] 纯文本查看 复制代码 os.write("HTTP/1.1 200 OK\r\n".getBytes());
os.write("Content-Type:text/html\r\n".getBytes());
os.write("\r\n".getBytes());
我们通过这个demo,讲解了一下服务器的工作原理.希望对大家理解服务器的工作有所裨益.
|