Java模拟实现Tomcat——Socket通信

2021/4/13 22:55:12

本文主要是介绍Java模拟实现Tomcat——Socket通信,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java模拟实现Tomcat——Socket通信

      • 1.Tomcat简介
      • 2. Socket网络编程
        • 2.1 Socket原理
        • 2.2 基于Java的socket网络编程实现
      • 3. 代码实现
      • 运行效果

1.Tomcat简介

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

2. Socket网络编程

  • Socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

2.1 Socket原理

  • Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。

  • 套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

  • 服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

  • 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

  • 连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

2.2 基于Java的socket网络编程实现

1、创建Socket;

2、 打开连接到Socket的输入/出流;

3、按照一定的协议对Socket进行读/写操作;

4、关闭Socket。

3. 代码实现

  • WorkThread.java
package com.icss.mytomcat;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

// IOC
/**
 * 用来处理每一个连接的子线程
 * @author 17647
 *
 */
public class WorkThread implements Runnable{
	//保存当前连接的套接字
	private Socket socket;
	
	public WorkThread(Socket socket) {
		this.socket=socket;
	}
	
	public void run() {
		
		try {
			InputStream in = this.socket.getInputStream(); //输入流读取请求数据
			OutputStream out = this.socket.getOutputStream();//输出流发送响应数据
			
			//读取请求头
			String requestHeader=""; //保存请求头信息
			BufferedReader  br = new BufferedReader(new InputStreamReader(in));
			String line=null;
			while((line = br.readLine())!=null && line.length()>0) {
				requestHeader += line +"\r\n";
			}
			
			//解析请求头
			String[] headers = requestHeader.split("\r\n");
			String url = headers[0].split(" ")[1];
						
			if(url.equals("/index.html")) {//如果请求index.html
				String filePath=this.getClass().getResource("/").getPath();
				File file=new File(filePath+"index.html");
				StringBuilder sb=new StringBuilder();
				sb.append("HTTP/1.1 200 OK\\r\\n");
				sb.append("Content-Type: text/html;charset=utf-8\\r\\n");
				sb.append("X-Ua-Compatible: IE=Edge,chrome=1\\r\\n");
				String path=this.getClass().getResource("/").getPath();
				System.out.println(path);
				BufferedReader reader=null;
				StringBuffer sbf=new StringBuffer();
				try {
				reader=new BufferedReader(new FileReader(file));
				String tempStr;
				while((tempStr=reader.readLine())!=null) {
					sbf.append(tempStr);
				}
				reader.close();
				}catch(IOException e) {
					e.printStackTrace();
				}finally {
					if(reader!=null) {
						try {
							reader.close();
						}catch(IOException e1) {
							e1.printStackTrace();
						}
					}
				}
				sb.append("Content-lenght:").append(sbf.toString().getBytes().length).append("\r\n");
				sb.append("\r\n");
				System.out.println(sb.append(sbf.toString()));
				BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));
				bw.write(sb.toString());
				bw.flush();
			}else if(url.equals("/tomcat.png")){//图片tomcat.png
				StringBuilder sb=new StringBuilder();
				sb.append("HTTP/1.0 200 OK\\r\\n");
				sb.append("Content-Type: image/png\\r\\n");
				sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
				
				String path=this.getClass().getResource("/").getPath();
				System.out.println(path);
				String fileName=path+"tomcat.png";
				File file=new File(fileName);
				DataInputStream fis=new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
				byte[] theData=new byte[(int)file.length()];
				fis.readFully(theData);
				fis.close();
				sb.append("Content-lenght:").append(theData.length).append("\r\n");
				sb.append("\r\n");
				System.out.println(sb.toString());
				BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));
				bw.write(sb.toString());
				bw.flush();
				out.write(theData);
				out.flush();
			}else {
			
			
				//实现最简单的应答(response)
				String responseHeader = "";//封装应答头
				String responseContent = "<html><head></head>"+
				"<body>"+"欢迎访问主页"++"<img src='https://i.loli.net/2021/04/06/E6GjJf7SDPKO2uT.png' title='quicker_0e51b84b-3298-4096-8bde-a979e27910a5.png' /></a></body></html>";//封装应答的内容
				responseHeader +="HTTP/1.1 200 OK\r\n";
				responseHeader +="Content-Type: text/html;charset=utf-8\r\n";
				responseHeader +="Content-length:"+responseContent.getBytes().length+"\r\n";
				responseHeader +="\r\n"; //响应头结束
				
				String content = responseHeader+responseContent;
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
				bw.write(content);
				bw.flush();
			
				bw.close();
			}
				out.close();
				in.close();
//				}
				socket.close();
				System.out.println(requestHeader);
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}finally {
				
			}
		
	}
}
  • HttpServer.java
package com.icss.mytomcat;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServer extends Thread{
	
	//服务器监听socket
	private ServerSocket serverSocket;
	
	public HttpServer(int port) {
		try {
			
			this.serverSocket=new ServerSocket(port);
			
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}
	
	public void run() {
		while(true) {
			try {
				System.out.println("服务器启动成功");
				//监听连接,返回当前连接的套接字
				Socket clientSocket = this.serverSocket.accept();
				//启动子线程处理当前的socket请求
				WorkThread wt =new WorkThread(clientSocket);
				new Thread(wt).start();
				
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			
		}
	}
	
	public static void main(String[] args) {
		new HttpServer(80).start();

	}

}

  • index.html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>首页</title>
	</head>
	<body>
		欢迎访问主页
	</body>
</html>

运行效果



这篇关于Java模拟实现Tomcat——Socket通信的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程