使用TCP来实现Tomcat的基础原理本质和使用TCP来上传文件类似,只不过客户端是浏览器,当浏览器访问这个服务器的时候,在服务器端回写一个html文件到浏览器
public class TCPServer {
public static void main(String[] args) {
/**创建服务器绑定指定端口
* */
ServerSocket server= null;
try {
server = new ServerSocket(8080);
} catch (IOException e) {
e.printStackTrace();
}
/**如果html页面有图片浏览器则会开启一个线程来请求图片
* 所以服务器要一种处于监听状态
* */
while (true){
try {
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();
/**截取请求信息
* */
String[] lines=line.split(" ");
System.out.println(line);
String htmlPath=lines[1].substring(1);
htmlPath=htmlPath.substring(htmlPath.indexOf("/")+1);
FileInputStream fis =new FileInputStream(htmlPath);
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());
/**回写到客户端
* */
byte[] bytes=new byte[1024];
int len=0;
while ((len= fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
/**防止read出现堵塞的情况
* */
socket.shutdownOutput();
}catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意:如果浏览器输入的是http://127.0.0.1:8080/netWork/web/login.html,则读取html的路径为web/login.html。要使用socket.shutdownOutput();防止read堵塞