直接代码:
package cn.tedu.core; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /**ZHEzhe这个类用来读取服务端的程序 * 1.生命ServerSocket对象 * 2.在构造函数中完成ServerSocket对象的初始化 * 3.提供start方法,接收客户端的请求并相应 * 4.提供main方法,启动服务器 * */ public class WebServer { //声明serversocket对象,,他是站在服务端的 private ServerSocket serverSocket; //生命一个线程池 private ExecutorService threadPool; //在构造方法中完成初始化 public WebServer() { try { serverSocket = new ServerSocket(8080); //初始化线程池对象,创建一个固定数量的线程池,最大数量100 threadPool = Executors.newFixedThreadPool(100); } catch (IOException e) { e.printStackTrace(); } } //tigongstartfangfa public void start(){ try { while (true){ //持续接收客户端请求 Socket socket = serverSocket.accept(); //执行线程类 threadPool.execute(new ClientHandler(socket)); //向浏览器返回 /*组织的数据格式不符合http协议 OutputStream outputStream = socket.getOutputStream(); outputStream.write("hello".getBytes()); outputStream.flush();*/ //改造输出格式 /*PrintWriter 输出字符 * PrintStream 输出除了字符还可以图片啥的*/ /*PrintStream ps = new PrintStream(socket.getOutputStream()); //拼接状态行 ps.println("HTTP/1.1 200 OK"); //响应头,相应内容:网页类型 ps.println("Context-Type:text/html"); //相应内容的长度 String data = "hello server~"; ps.println("Content-Length:"+data.length()); //空白行 ps.println(); //拼接相应实体内容 ps.write(data.getBytes()); ps.flush(); socket.close();*/ } } catch (IOException e) { e.printStackTrace(); } } //提供main方法启动 public static void main(String[] args) { WebServer webServer = new WebServer(); //接收请求并相应 webServer.start(); } }
package cn.tedu.core; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.PrintWriter; import java.net.Socket; import java.util.Arrays; import java.util.Spliterator; import com.sun.corba.se.impl.orb.ParserTable.TestAcceptor1; import com.sun.org.apache.xpath.internal.operations.Bool; import sun.java2d.pipe.SpanClipRenderer; /**这个类作为一个线程类,抽取sTART 方法的代码*/ public class ClientHandler implements Runnable { //1声明socket对象4 private Socket socket; //2zao在狗仔函数中传入socket对象,并保存类中 public ClientHandler(Socket socket){ //this表示本类对象 this.socket=socket; } //3重写润方法,抽取start @Override public void run() { //相应代码 try { //获取请求行的数据 //BufferdReader 可以读一行数据,字符流 //InputStreamReader可以吧字节流转换成字符流 // socket.getInputStream()是字节流 BufferedReader bReader = new BufferedReader( new InputStreamReader(socket.getInputStream())); //获取第一行数据 String readLine = bReader.readLine(); System.out.println(readLine); if (readLine!=null) { String[] split = readLine.split(" "); System.out.println(Arrays.toString(split)); String url = split[1]; if(!url.equals("index.html")||!url.equals("test.html")){ url = "index.html"; } PrintStream ps = new PrintStream(socket.getOutputStream()); //保证响应头只许发一次 boolean ll = false; if (!ll) {//如果没有发送就发送一次 //相应状态 ps.println("HTTP/1.1: 200"); //xiang相应头 ps.println("Context-Type:text/html"); String data = "is ok !!!"; File file = new File("WebContent/"+url); ps.println("Content-Length" + file.length()); //空白行 ps.println(); //相应实体内容 // ps.write(data.getBytes()); BufferedInputStream bi = new BufferedInputStream(new FileInputStream(file)); byte[] b = new byte[(int) file.length()]; bi.read(b); ps.write(b); ps.flush(); socket.close(); ll=true; } } } catch (IOException e) { e.printStackTrace(); } } }