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端口号。结果如下图所示。

![image.png](/img/bVbMHjb)

点击超链接

![image.png](/img/bVbMHjl)