java Socket实现简单模拟HTTP服务器
程序员文章站
2024-02-22 09:31:58
最近复习计算机网络,复习完应用层之后对于理论知识还是没有一个深刻的概念,索性就动手用java socket api 模拟做一个http服务器,巩固一下应用层的知识。
ht...
最近复习计算机网络,复习完应用层之后对于理论知识还是没有一个深刻的概念,索性就动手用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服务器全过程。希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: python操作mysql数据库
下一篇: python开发简易版在线音乐播放器