模拟BS服务器分析
- 客户端:浏览器
- 服务器:自己创建一个
创建BS版本的TCP服务器
-
使用浏览器,在地址栏输入服务器IP地址,端口号,文件夹名称,进行访问
-
打印看看,浏览器请求的是什么东西
package cn.learn.web;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class BroswerServer {
public static void main(String[] args) throws IOException {
//创建一个服务器ServerSocket,并在构造方法中指定系统的端口号
ServerSocket server = new ServerSocket(8080);
//使用accept方法获取到请求的客户端对象(浏览器)
Socket bsSocket = server.accept();
//使用Socket中的方法getInputStream(),获取网络字节输入流
InputStream serIn = bsSocket.getInputStream();
//使用read()方法,读取客户端请求信息
byte[] bytes =new byte[1024];
int len = 0;
while((len = serIn.read(bytes)) != -1){
//控制台看看
System.out.println(new String(bytes,0,len));
}
}
}
- 获取请求的页面地址,读取服务器的文件,并返回给客户端,如客户端请求的页面有图片,那么浏览器就会单独的开启一个线程,读取服务器的图片,我们就必须得让服务器一直处于监听状态。
package cn.learn.web;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class BroswerServer {
public static void main(String[] args) throws IOException {
//创建一个服务器ServerSocket,并在构造方法中指定系统的端口号
ServerSocket server = new ServerSocket(8080);
while(true){
//使用accept方法获取到请求的客户端对象(浏览器)
Socket bsSocket = server.accept();
//**********开启多线程**************
new Thread(new Runnable() {
@Override
public void run() {
try {
//使用Socket中的方法getInputStream(),获取网络字节输入流
InputStream serIn = bsSocket.getInputStream();
//把serIN网络字节输入流对象,转换为字符缓冲输入流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(serIn));
//把客户端请求的第一行读取出来并提取自己想要的部分
String line[] = bufferedReader.readLine().split(" ");
//从数组中拿取自己想要的信息,拿到服务器文件存储地址
String html = line[1];
//使用Socket中的方法getOutPutStream获取网络字节输出流
OutputStream returnOut = bsSocket.getOutputStream();
//写入HTTP协议响应头(固定写法)
returnOut.write("HTTP/1.1 200 OK
".getBytes());
returnOut.write("Content-Type:text/html
".getBytes());
//必须写入空行,否则浏览器不解析
returnOut.write("
".getBytes());
//创建一个本地的字节输入流,构造方法绑定html路径,读取服务器文件内容
FileInputStream in = new FileInputStream(html);
//一读一写复制文件,把服务器读取的html文件给写回浏览器
int len = 0;
byte[] bytes = new byte[1024];
while ((len = in.read(bytes)) != -1){
returnOut.write(bytes,0,len);
}
//释放资源
in.close();
bsSocket.close();
}catch (IOException e){
e.getStackTrace();
}
}
}).start();
}
// server.close();
}
}