欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

达内javaSE_day20 —— 服务器v1-v4

程序员文章站 2022-05-25 21:15:52
...

服务器

v1 多线程的服务器端

写多线程的服务器端(ClientHandler)

  1. 包:cn.tedu.core
  2. 类名:WebServer
  3. 声明成员变量:server:ServerSocket
  4. 方法:
    无参的构造方法:WebServer
    功能:初始化server,端口号为8080
    start方法
    功能:启动服务器
    接收客户端请求:accept()
    定义线程对象,并启动线程start()
  5. 定义内部类:ClientHandler
    线程类定义成员变量:socket:Socket
    定义带参的构造方法初始化:socket
    重写run方法:功能:控制台输出处理客户端请求
  6. 定义main方法:启动服务器
  7. 测试:打开浏览器客户端:http://localhost:8080/

WebServer.java

package cn.tedu.core;
public class WebServer {
	private ServerSocket server;
	public WebServer()  {
		try {
			server = new ServerSocket(8080);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
	public void Start(){
		try {
			while(true){
				System.out.println("等待客户端的请求......");
				Socket socket = server.accept();
				new Thread(new ClientHandler(socket)).start();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}						
	}
	
	class ClientHandler implements Runnable{
		Socket socket ;
		public ClientHandler(Socket socket) {
			this.socket = socket;
		}
		@Override
		public void run() {
			System.out.println("接收到了客户端请求......");			
		}				
	}
	public static void main(String[] args) {
		new WebServer().Start();
	}
}

运行截图:
达内javaSE_day20 —— 服务器v1-v4

v2 读客户端的请求

  1. 读客户端的请求。
    在run方法处理客户端请求
    1)获取InputStream对象
    2)使用read方法读取数据,判断如果!=-1,输出
    3)观察打印结果:学习http协议请求头信息格式
  2. 解析请求行:
    1)使用StringBuilder存放
    2)测试:打开浏览器客户端:http://localhost:8080/myweb/index.html
  3. 解析url,并打印输出

WebServer.java

class ClientHandler implements Runnable{
		Socket socket ;
		public ClientHandler(Socket socket) {
			this.socket = socket;
		}
		@Override
		public void run() {
			System.out.println("接收到了客户端请求......");
			try {
				InputStream in = socket.getInputStream();
				StringBuilder builder = new StringBuilder();				
				int d = -1;
				char c1 = 0,c2 = 0;
				while((d = in.read())!=-1) {
					c2 = (char)d;
					//解析第一行
					if (c1==13 && c2 == 10) {//\r\n  13 10
						break;
					}
					builder.append(c2);
					c1 = c2;//存储到前面字符的变量					
					//System.out.print((char)d);// 不写ln,因为在每行后面,有\r\n  13 10
				}
				String str = builder.toString().trim();//trim()去除\r\n
				//System.out.println(str);
				String[] data = str.split(" ");
				System.out.println(data[0]);//请求方式
				System.out.println(data[1]);//URL请求的资源
				System.out.println(data[2]);//协议名称				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		}				
	}

达内javaSE_day20 —— 服务器v1-v4
运行截图:
达内javaSE_day20 —— 服务器v1-v4

v3 定义HttpRequest类

  1. 定义HttpRequest类。
    1)定义HttpRequest类在com.tedu.http包中
    2)定义变量:method,url,protocol;
    3)定义带参的构造方法HttpRequest(InputStream in)
    4)定义三个变量的get方法
    5)定义方法:parseRquestLine(InputStream in):void
    方法的功能:解析请求行,给三个变量赋值
    在构造方法中调用
  2. 重构WebServer的run方法。
    创建HttpRequest对象,调用get方法打印请求的方法,url,protocl
  3. 测试:打开浏览器客户端:http://localhost:8080/myweb/index.html

HttpServer.java

package cn.tedu.http;

public class HttpRequest {
	private String method;
	private String url;
	private String protocol;
	public HttpRequest(InputStream in) {
		try {
			parseRequestLine(in);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private void parseRequestLine(InputStream in) throws IOException {
		StringBuilder builder = new StringBuilder();		
		int d = -1;
		char c1 = 0,c2 = 0;
		while((d = in.read())!=-1) {
			c2 = (char)d;
			//解析第一行
			if (c1==13 && c2 == 10) {//\r\n  13 10
				break;
			}
			builder.append(c2);
			c1 = c2;//存储到前面字符的变量
		}
		String str = builder.toString().trim();//trim()去除\r\n
		//System.out.println(str);
		String[] data = str.split(" ");
		this.method = data[0];//请求方式
		this.url = data[1];//URL请求的资源
		this.protocol = data[2];//协议名称		
	}
	public String getMethod() {
		return method;
	}
	public String getUrl() {
		return url;
	}
	public String getProtocol() {
		return protocol;
	}	
}

WebServer.java
达内javaSE_day20 —— 服务器v1-v4

v4 读文件,响应文件到客户端

  1. 在项目中添加目录webapps,并在里面添加一个子目录myweb,然后在其中存放我们定义的页面index.html。
  2. 响应包括两部分,响应头和响应文件
  3. 学习掌握响应头信息
  4. 响应画面到客户端
    1)读文件:通过url File file = new File(“webapps”+request.getUrl());
    2)获取输出流
    3)通过输出流写响应头信息

index.html
达内javaSE_day20 —— 服务器v1-v4
WebServer.java
达内javaSE_day20 —— 服务器v1-v4
运行截图:
达内javaSE_day20 —— 服务器v1-v4

相关标签: javaSE实训笔记