java Socket实现简单模拟HTTP服务器
2017-05-10 09:32
603 查看
最近复习计算机网络,复习完应用层之后对于理论知识还是没有一个深刻的概念,索性就动手用Java Socket API 模拟做一个HTTP服务器,巩固一下应用层的知识。
HTTP基于TCP协议,协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容――百度百科。
话不多说,还是直接上图。
具体字段这里不作解释,不懂的请先自己了解http协议。这里主要是根据请求响应这一过程模拟HTTP服务器。
下面是代码:
package com.example.httpserver; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class HttpServer { private static final Integer port = 80;//HTTP默认端口80 public static void main(String[] args) { ServerSocket serverSocket; try { //建立服务器Socket,监听客户端请求 serverSocket = new ServerSocket(port); System.out.println("Server is running on port:"+serverSocket.getLocalPort()); //死循环不间断监听客户端请求 while(true){ final Socket socket = serverSocket.accept(); System.out.println("biuld a new tcp link with client,the cient address:"+ socket.getInetAddress()+":"+socket.getPort()); //并发处理HTTP客户端请求 service(socket); } } catch (IOException e) { e.printStackTrace(); } } public static void service(Socket socket) { new Thread(){ public void run(){ InputStream inSocket; try { //获取HTTP请求头 inSocket = socket.getInputStream(); int size = inSocket.available(); byte[] buffer = new byte[size]; inSocket.read(buffer); String request = new String(buffer); System.out.println("ClientBrowser:\n"+request+"\n" + "------------------------------------------------------------------"); String firstLineOfRequest = ""; String[] heads; String uri = "/index.html"; String contentType =""; if(request.length() > 0){ firstLineOfRequest = request.substring(0,request.indexOf("\r\n")); heads = firstLineOfRequest.split(" "); uri = heads[1]; if(uri.indexOf("html") != -1){ contentType = "text/html"; }else{ contentType = "application/octet-stream"; } } //将响应头发送给客户端 String responseFirstLine = "HTTP/1.1 200 OK\r\n"; String responseHead = "Content-Type:" + contentType +"\r\n"; OutputStream outSocket = socket.getOutputStream(); System.out.println("ServerResponse:\n"+responseFirstLine+"\n"+responseHead+"\n" + "--------------------------------------------------------------------"); outSocket.write(responseFirstLine.getBytes()); outSocket.write(responseHead.getBytes()); //通过HTTP请求中的uri读取相应文件发送给客户端 FileInputStream writehtml = new FileInputStream(new File("wwwroot"+uri)); outSocket.write("\r\n".getBytes()); byte[] htmlbuffer = new byte[writehtml.available()]; if(writehtml !=null){ int len = 0; System.out.println("writeHtml"); while((len = writehtml.read(htmlbuffer)) != -1){ outSocket.write(htmlbuffer, 0,len); } } outSocket.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }
代码看注释也很容易理解。现在我们在浏览器中输入服务器地址+要访问的文件
在看我们控制台输出的内容:
以上就是Java Socket 简单的模拟HTTP服务器全过程。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
相关文章推荐
- 使用Java socket简单模拟HTTP服务器
- angularjs简单实现$http.post(CORS)跨域及$http.post传参方式模拟jQuery.post
- java Socket实现简单在线聊天(一)
- Spring学习--面向抽象编程(模拟Spring的简单实现)
- 初学Java Socket编程实现简单的问候服务
- L脚本语言实现简单的HTTP服务器
- python socket 实现的简单http服务器
- 【Java并发】生产者-消费者模式简单实现(模拟消息队列)
- 简单模拟 spring的bean容器的实现
- 一个简单的http服务器的实现
- 用AJAX实现google输入自动完成的简单模拟
- Python实现简单的HTTP服务器
- java网络编程——socket简单模拟http服务器
- 模拟spring - 简单实现spring IOC
- 自己如何实现简单的http服务器
- 用AJAX实现google输入自动完成的简单模拟
- Java 实现简单的Http服务器
- java Socket 的简单使用 实现对话交流功能
- java Socket 的简单使用 实现对话交流功能
- 计算机网络实验,JAVA实现一个简单GBN协议,模拟引入数据包的丢失,验证协议的有效性