本篇文章小编给大家分享一下java服务器简单实现过程记录代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
一、HTTP
http请求
一般一个http请求包括以下三个部分:
1 请求方法,如get,post
2 请求头
3 实体
一个http请求的实例如下:
GET /index.jsp HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.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
注意红色部分的url,这是我们待会要截取出来的。
http响应
与http请求类似,http响应也包括三个部分
1 协议-状态码-描述
2 响应头
3 响应实体段
二、socket类
套接字是网络连接的断点。套接字使得应用程序可以从网络中读取数据,可以向网络中写入数据。不同计算机上的应用程序可以通过套接字发送或接受字节流。java中提供了Socket类来实现这个功能,通过getInputStream和getOutputStream可以获取网络中的输入输出流。
但是,光靠Socket类还是不能够实现我们构建一个服务器应用程序的功能的,因为服务器必须时刻待命,因此java里面提供了ServerSocket类来处理等待来自客户端的请求,当ServerSocket接受到了来自客户端的请求之后,它就会创建一个实例来处理与客户端的通信。
三、服务器应用程序的实现
首先,我们要构建一个封装请求信息的类requst,一个响应请求的类response,还要有一个主程序httpServer来处理客户端来的请求。
package com.lwq; import java.io.IOException; import java.io.InputStream; /** * @author Joker * 类说明 * 将浏览器发来的请求信息转化成字符和截取url */ public class Request { //输入流 private InputStream input; //截取url,如http://localhost:8080/index.html ,截取部分为 /index.html private String uri; public Request(InputStream inputStream){ this.input = inputStream; } public InputStream getInput() { return input; } public void setInput(InputStream input) { this.input = input; } public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } //从套接字中读取字符信息 public void parse(){ StringBuffer request = new StringBuffer(2048); int i = 0; byte[] buffer = new byte[2048]; try { i = input.read(buffer); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); i = -1; } for(int j = 0;jindex1){ return requestString.substring(index1+1,index2); } } return null; } }
下面是封装了响应请求的类response:
package com.lwq; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; /** * @author Joker * @version 创建时间:Sep 5, 2012 9:59:53 PM * 类说明 根据相应信息返回结果 */ public class Response { private static final int BUFFER_SIZE = 1024; Request request; OutputStream output; public Response(OutputStream output){ this.output = output; } public void sendStaticResource() throws IOException{ byte[] bytes = new byte[BUFFER_SIZE]; FileInputStream fis = null; File file = new File(HttpServer.WEB_ROOT,request.getUri()); if(file.exists()){ try { fis = new FileInputStream(file); int ch = fis.read(bytes,0,BUFFER_SIZE); while(ch != -1){ output.write(bytes,0,ch); ch = fis.read(bytes,0,BUFFER_SIZE); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }finally{ if(fis !=null){ fis.close(); } } }else{ //找不到文件 String errorMessage = "HTTP/1.1 404 File Not Foundrn" + "Content-Type: text/htmlrn" + "Content-Length: 23rn" + "rn" + " File Not Found "; try { output.write(errorMessage.getBytes()); output.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public Request getRequest() { return request; } public void setRequest(Request request) { this.request = request; } public OutputStream getOutput() { return output; } public void setOutput(OutputStream output) { this.output = output; } public static int getBUFFER_SIZE() { return BUFFER_SIZE; } }
接下来是主程序,
package com.lwq; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * @author Joker * 类说明 */ public class HttpServer { /** * @param args */ //WEB_ROOT是服务器的根目录 public static final String WEB_ROOT = System.getProperty("user.dir")+File.separator+"webroot"; //关闭的命令 private static final String SHUTDOWN_COMMAND= "/SHUTDOWN"; public static void main(String[] args) { // TODO Auto-generated method stub HttpServer server = new HttpServer(); server.await(); } public void await(){ ServerSocket serverSocket = null; int port = 8080; try { serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1")); while(true) { try { Socket socket = null; InputStream input = null; OutputStream output = null; socket = serverSocket.accept(); input = socket.getInputStream(); output = socket.getOutputStream(); //封装request请求 Request request = new Request(input); request.parse(); //封装response对象 Response response = new Response(output); response.setRequest(request); response.sendStaticResource(); socket.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); continue; } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行httpServer,在浏览器中打下http://localhost:8080/index.jsp,就能看到服务器响应的结果了。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整