简介:
Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。
一:浏览器的请求头
下面是Firefox浏览器,GET请求的数据头:
GET / HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
/r/n
在没个换行后面都有一个"\r\n",在最后一行的下面还有还有一个"\r\n"
POST请求的数据头:
略
二:HTTP服务器响应数据的头
自定义服务器,的基本的响应的数据头
HTTP/1.1 200 OK
Content-Type:text/html
Content-Length:6
/r/n
在没个换行后面都有一个"\r\n",在最后一行的下面还有还有一个"\r\n"
其中上面的Content-Length参数是必不可少的,其指定的是HTTP响应的正文的长度,在浏览器上面,就会根据这个参数,知道这个HTTP数据流的结束点。(在编写HTTP的代理服务器的上面,一定要注意这点。)
三、Java代码实现一个简单的HTTP服务器。
设置端口为8080 ,新建了个线程池,池的大小为8。当请求到来时,所有响应的数据,都是Hello !
public class MyServer {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyServer().startHttp();
}
private void startHttp() {
// TODO Auto-generated method stub
try {
ServerSocket serverSocket = new ServerSocket(8080);
//初始化一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(8);
System.out.println("打开服务!");
Socket socket;
while (true) {
socket = serverSocket.accept();
executorService.execute(new Handler(socket));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class Handler implements Runnable {
Socket socket;
public Handler(Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("端口号" + socket.getPort());
try {
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
//读取浏览器的头中包含的数据
byte buffer[] = new byte[inputStream.available()];
int i = -1;
inputStream.read(buffer);
String readHead = new String(buffer);
System.out.println("请求的浏览器的数据:\n" + readHead + "\n________\n");
String string = "Hello!";
//设置响应数据的头
String split = "\r\n";
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("HTTP/1.1 200 OK\r\n");
stringBuffer.append("Content-Type:text/html" + split);
stringBuffer
.append("Content-Length:" + string.length() + split);
stringBuffer.append("\r\n");
stringBuffer.append(string);
System.out.println("响应的数据"+stringBuffer.toString());
outputStream.write(stringBuffer.toString().getBytes());
outputStream.flush();
outputStream.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
四:效果图
浏览器:
服务器控制台:
参考:
POST的讨论 http://bbs.csdn.net/topics/310107460
WEB 服务器定义 http://baike.baidu.com/view/460250.htm