这篇文章给大家介绍在java项目中使用 Socket如何实现模拟一个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(); }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机在java项目中使用 Socket如何实现模拟一个HTTP服务器
服务器2023-05-31
在Java项目中使用Socket 如何实现 一个TCP服务端
服务器2023-05-31
在java项目中如何实现一个单例模式
服务器2023-05-31
如何在Java项目中实现一个命令模式
服务器2023-05-31
如何在Java项目中实现一个抽象工厂模式
服务器2023-05-31
在springboot项目中使用quartz如何实现一个定时任务
服务器2023-05-31
如何在java项目中实现一个递归调用功能
服务器2023-06-06
在Java项目中使用WebUploader如何实现一个文件上传功能
服务器2023-05-31
在java项目中使用Demo如何实现一个文件上传功能
服务器2023-05-31
在Java项目中使用递归如何实现一个文件读取功能
服务器2023-05-31
如何在Java项目中使用OCR tesseract实现一个图文识别功能
服务器2023-05-31
使用阿里云服务器如何实现部署一个javaWeb项目
服务器2023-05-31
在mybatis项目中使用oracle如何实现一个分页效果
服务器2023-05-31
在Spring项目中使用 Hibernate如何实现一个分页功能
服务器2023-05-31
在Java项目中使用fileupload组件如何实现一个文件上传功能
服务器2023-05-31
在Java项目中使用字节流如何实现一个文件复制功能
服务器2023-05-31
利用Spring jsonp如何在java项目中实现一个跨域请求
服务器2023-05-31
如何在Java项目中利用字符流实现一个io编程
服务器2023-05-31
java项目中使用datatables如何实现一个带条件查询功能
服务器2023-05-31
咦!没有更多了?去看看其它编程学习网 内容吧