达内javaSE_day20 —— 服务器v1-v4
程序员文章站
2022-05-25 21:15:52
...
javaSE_day20
服务器
v1 多线程的服务器端
写多线程的服务器端(ClientHandler)
- 包:cn.tedu.core
- 类名:WebServer
- 声明成员变量:server:ServerSocket
- 方法:
无参的构造方法:WebServer
功能:初始化server,端口号为8080
start方法:
功能:启动服务器
接收客户端请求:accept()
定义线程对象,并启动线程start() - 定义内部类:ClientHandler
线程类定义成员变量:socket:Socket
定义带参的构造方法初始化:socket
重写run方法:功能:控制台输出处理客户端请求 - 定义main方法:启动服务器
- 测试:打开浏览器客户端: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();
}
}
运行截图:
v2 读客户端的请求
- 读客户端的请求。
在run方法处理客户端请求
1)获取InputStream对象
2)使用read方法读取数据,判断如果!=-1,输出
3)观察打印结果:学习http协议请求头信息格式 - 解析请求行:
1)使用StringBuilder存放
2)测试:打开浏览器客户端:http://localhost:8080/myweb/index.html - 解析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();
}
}
}
运行截图:
v3 定义HttpRequest类
- 定义HttpRequest类。
1)定义HttpRequest类在com.tedu.http包中
2)定义变量:method,url,protocol;
3)定义带参的构造方法HttpRequest(InputStream in)
4)定义三个变量的get方法
5)定义方法:parseRquestLine(InputStream in):void
方法的功能:解析请求行,给三个变量赋值
在构造方法中调用 - 重构WebServer的run方法。
创建HttpRequest对象,调用get方法打印请求的方法,url,protocl - 测试:打开浏览器客户端: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
v4 读文件,响应文件到客户端
- 在项目中添加目录webapps,并在里面添加一个子目录myweb,然后在其中存放我们定义的页面index.html。
- 响应包括两部分,响应头和响应文件
- 学习掌握响应头信息
- 响应画面到客户端
1)读文件:通过url File file = new File(“webapps”+request.getUrl());
2)获取输出流
3)通过输出流写响应头信息
index.html
WebServer.java
运行截图:
上一篇: HashMap 原理分析
下一篇: 八皇后问题递归回溯法