在浏览器输入url会找到对应的ip地址和端口号来发送请求。
1.新建一个java工程。
新建一个类Tom,有程序入口main方法。是开启服务的一个类。
写一个start()方法
//创建服务器监听 public void start(int port){ try { if(serverSocket == null){ serverSocket = new ServerSocket(PORT); //定义监听端口 } ExecutorService pool = Executors.newFixedThreadPool(100); //创建线程池,容量为100 while(true){ socket = serverSocket.accept(); //就收到请求 System.out.println("有新的请求" + socket.toString()); pool.submit(new MySocketHandler(socket)); //收到一个请求,通过传递socket 分配一个线程管理. } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
2.每收到一个请求就分配一个线程管理。那么线程怎么管理呢?
新建一个MySocketHandler类,该类继承Runnable。写一个该类的构造器,用于与关联请求我们用Socket作为参数传递。
public MySocketHandler(Socket socket) { //Socket对象作为传入参数,与请求关联。 // TODO Auto-generated constructor stub try { inputStream = socket.getInputStream(); //获得socket连接的输入流 outputStream = socket.getOutputStream(); //获得socket连接的输出流 out = new PrintStream(outputStream); //http协议的标准输出流。socket的输出流进行包装,以便更好输出响应给浏览器 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
3.获得了请求,即socket连接的输入流。我们就对这条请求的内容进行解析,请求些什么东西。
public String parseRequest(InputStream inputStream) { InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String[] strings = null; try { String readLine = bufferedReader.readLine(); //读取第一行, GET /psbCA2NQZW5.jpg HTTP/1.1 strings = readLine.split(" "); //对第一行的数据选择分割,得到用户请求要访问的文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (strings[1].equals(File.separator)) { return "psbCA2NQZW5.jpg"; }else { return strings[1]; } }
4.给定请求访问的文件的路径:
public static final String PATH="E:" + File.separator + "games" + File.separator; //定义文件的路径 public void getFile(String fileName) throws IOException{ File file = new File(PATH + fileName); //通过路径名和文件名来引用 System.out.println(file); if (!file.exists()) { System.out.println("您请求的文件不存在"); out.println("HTTP/1.1 404 NOT FOUND"); }else{ try { FileInputStream fileInputStream = new FileInputStream(file); //文件输入流读到工程中 @SuppressWarnings("resource") BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); //转为Buffer输入流 byte[] bytes = new byte[(int) file.length()]; bufferedInputStream.read(bytes); //读到字节数组中 out.println("HTTP/1.1 200 OK"); //http标准输出流输出响应到浏览器, 200代表响应成功 out.println(); out.write(bytes); //输出流给请求的文件 out.flush(); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }