JAVA实现一个简单的服务器
服务器在线浏览网页离不开服务器。用户发出请求request,服务器做出响应response,提供给用户需要的页面。响应的内容是根据每个web请求来产生动态内容的,其内部即启动多个线程来产生不同内容。
web请求都是使用 Request 和Response 式的交流,这种请求响应式的交互都是基于HTTP协议。
如何手写服务器
所需技术:Socket 【服务客户端与服务器传输数据】
IO 【客户端与服务端数据传输管道】
Thread 【业务代码执行者】
String 【字符串操作】
StringBuilder【操作高效字符串】
Http协议 【数据组织规则】
协议
协议:为信息如何进行传输而定义的格式。(是一种规范)
Http
HTTP:超文本传输协议(用于网站内容的传输协议)
超文本(hypertext):将整个web网络连接起来
HTTP传输协议格式
请求资源描述内容GET /index.html HTTP/1.1 //网站和协议版本
Host:127.0.0.1:9999 //机器IP地址和端口号
Connect:keep-alive //继续否
program:no-cache //是否需要缓存
upgrade-Insecure-Requests:1
user-Agent:Mozilla/5.0 (Window NT 6.1; WOW64)AppleWebkit/537.36(KHTML, like Gecko)
Chrome/63.0.3239 Safari/537.36 //浏览器版本
Accept:text/html,application/xhtml+xml,*/*;q=0.8 //返回格式
Accept-Encoding:gzip,deflat,br //格式压缩
Accept-Language:zh-CN,zh;q=0.9 //返回内容语言
Cookie:__guid=96992031.2361143158034034076000.11562739361299.4512 //表示向服务器要内容者
返回资源描述内容(响应)//响应协议头
HTTP/1.1 200 OK rn //格式版本 正常返回内容
Server:ynuo 0.1v rn //服务器名字
Date:%srn
Content-Type:%s;charset=UTF-8 rn //响应内容格式
Access-control-Allow-Origin:* rn //谁可以向服务器请求内容
Content-Length:%drnrn
//规则协议体
内容
web服务器编写
设计思路客户端(浏览器)与服务器建立网络连接(ServerSocket),客户端(浏览器)向服务器请求内容(包含在HTTP请求信息中),服务器读取客户端发来的请求信息动态产生内容(多线程)进行响应。编写服务代码
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class WebStation {
//换行
private static final String ENTER = "rn";
//空格
private static final String SPACE = " ";
//是否关机
private boolean isShutDown = false;
/**
* 指定服务器端口
* @param args
*/
public void start(int port) {
try {
ServerSocket serverSocket = new ServerSocket(port);
//接收来自浏览器的请求
this.recevie(serverSocket);
} catch (IOException e) {
stop();
}
}
/**
* 关闭服务器
*/
private void stop() {
isShutDown = true;
}
/**
* 接受客户端消息
*/
private void recevie(ServerSocket serverSocket) {
try {
//只要不关机就接收客户请求
while (!isShutDown) {
final Socket client = serverSocket.accept(); //接受客户
//开启一个线程去执行客户请求
new Thread() {
public void run() {
try {
InputStream is = client.getInputStream(); //获得客户的输入流
//返回给客户端的响应内容
String clientContent = "郑雅菱的心理活动,看看去!";
//输出描述内容
StringBuilder headerInfo = new StringBuilder();
headerInfo.append("HTTP/1.1").append(SPACE).append(200).append(SPACE);
headerInfo.append("OK").append(ENTER);
headerInfo.append("Server:zyl").append(SPACE).append("0.0.1v").append(ENTER);
headerInfo.append("Date:Sat,"+SPACE).append(new Date()).append(ENTER);
headerInfo.append("Content-Type:text/html;charset=UTF-8").append(ENTER);
headerInfo.append("Content-Length:").append((clientContent+ENTER).toString().getBytes().length).append(ENTER);
headerInfo.append("Access-Control-Allow-Origin:").append("*").append(ENTER);
headerInfo.append(ENTER);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
bw.append(headerInfo.toString()); //输出头部描述内容
bw.append(clientContent); //输出头部描述内容
bw.append(ENTER); //换行 内容输出完成
bw.flush(); //内存->客户端
bw.close(); //关闭输出流
is.close(); //关闭输入流
//输出到控制台
System.out.println(headerInfo.toString());
System.out.println(clientContent+ENTER);
}catch(IOException e) {
e.printStackTrace();
}
};
}.start();
}
}catch (IOException e) {
e.printStackTrace();
isShutDown = true;
}
}
public static void main(String[] args) {
//创建web初始站点
WebStation server = new WebStation();
//开启服务站点
server.start(80);
}
}
```
进行了如下操作:
* 安装了VM和CentOS
* 打开终端,并进行网络配置
* 安装JDK
* 代码编译
* touch WebStation.java
* javac WebStation.java
* 运行起初Web站点
* java WebStation
* 校验服务是否正常启动
* netstat -tlnup|grep 80|
* jps
* 查询自己的IP地址
* 在终端里输入ifconfig -a命令在回车键
##### 结果截图
打开浏览器,输入当前IP地址+80端口号。结果如下图所示。

点击超链接
