📄 简单的用 java socket 编写的 http 服务器应用,帮助学习http协议.htm
字号:
style="COLOR: #000000"> resource</SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN
style="COLOR: #000000">URLDecoder.decode(resource, </SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">UTF-8</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000">反编码 URL 地址</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> String method </SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">new</SPAN><SPAN
style="COLOR: #000000"> StringTokenizer(line).nextElement().toString();</SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000"> 获取请求方法, GET 或者 POST<BR><BR> </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000"> 读取所有浏览器发送过来的请求参数头部信息</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">while</SPAN><SPAN
style="COLOR: #000000">( (line </SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN
style="COLOR: #000000"> in.readLine()) </SPAN><SPAN
style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">null</SPAN><SPAN
style="COLOR: #000000">) {<BR> System.out.println(line);<BR> <BR> </SPAN><SPAN
style="COLOR: #0000ff">if</SPAN><SPAN
style="COLOR: #000000">(line.equals(</SPAN><SPAN
style="COLOR: #000000">""</SPAN><SPAN
style="COLOR: #000000">)) </SPAN><SPAN
style="COLOR: #0000ff">break</SPAN><SPAN
style="COLOR: #000000">;<BR> }<BR> <BR> </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000"> 显示 POST 表单提交的内容, 这个内容位于请求的主体部分</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">POST</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">.equalsIgnoreCase(method)) {<BR> System.out.println(in.readLine());<BR> }<BR> <BR> System.out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">请求信息结束\n***************</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">);<BR> System.out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">用户请求的资源是:</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN
style="COLOR: #000000">resource);<BR> System.out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">请求的类型是: </SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #000000">+</SPAN><SPAN
style="COLOR: #000000"> method);<BR><BR> </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000"> GIF 图片就读取一个真实的图片数据并返回给客户端</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">if</SPAN><SPAN
style="COLOR: #000000">(resource.endsWith(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">.gif</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">)) {<BR> fileService(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">images/test.gif</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">, client);<BR> closeSocket(client);<BR> </SPAN><SPAN
style="COLOR: #0000ff">continue</SPAN><SPAN
style="COLOR: #000000">;<BR> }<BR> <BR> </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000"> 请求 JPG 格式就报错 404</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #0000ff">if</SPAN><SPAN
style="COLOR: #000000">(resource.endsWith(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">.jpg</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">)) {<BR> PrintWriter out</SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN
style="COLOR: #000000"> PrintWriter(client.getOutputStream(),</SPAN><SPAN
style="COLOR: #0000ff">true</SPAN><SPAN
style="COLOR: #000000">);<BR> out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">HTTP/1.0 404 Not found</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000">返回应答消息,并结束应答</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> out.println();</SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000"> 根据 HTTP 协议, 空行将结束头信息</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> out.close();<BR> closeSocket(client);<BR> </SPAN><SPAN
style="COLOR: #0000ff">continue</SPAN><SPAN
style="COLOR: #000000">;<BR> } </SPAN><SPAN
style="COLOR: #0000ff">else</SPAN><SPAN
style="COLOR: #000000"> {<BR> </SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000"> 用 writer 对客户端 socket 输出一段 HTML 代码</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> PrintWriter out</SPAN><SPAN
style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN
style="COLOR: #000000"> PrintWriter(client.getOutputStream(),</SPAN><SPAN
style="COLOR: #0000ff">true</SPAN><SPAN
style="COLOR: #000000">);<BR> out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">HTTP/1.0 200 OK</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000">返回应答消息,并结束应答</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"> out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">Content-Type:text/html;charset=GBK</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">);<BR> out.println();</SPAN><SPAN
style="COLOR: #008000">//</SPAN><SPAN
style="COLOR: #008000"> 根据 HTTP 协议, 空行将结束头信息</SPAN><SPAN
style="COLOR: #008000"><BR></SPAN><SPAN
style="COLOR: #000000"><BR> out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000"><h1> Hello Http Server</h1></SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">);<BR> out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">你好, 这是一个 Java HTTP 服务器 demo 应用.<br></SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">);<BR> out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">您请求的路径是: </SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #000000">+</SPAN><SPAN
style="COLOR: #000000"> resource </SPAN><SPAN
style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000"><br></SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">);<BR> out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">这是一个支持虚拟路径的图片:<img src='abc.gif'><br></SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN
style="COLOR: #000000">+</SPAN><SPAN
style="COLOR: #000000"><BR> </SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000"><a href='abc.gif'>点击打开abc.gif, 是个服务器虚拟路径的图片文件.</a></SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
style="COLOR: #000000">);<BR> out.println(</SPAN><SPAN
style="COLOR: #000000">"</SPAN><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -