import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.URLDecoder; import java.util.regex.Matcher; import java.util.regex.Pattern; public class HttpServer { public static void doGet(String message,OutputStream op) throws IOException{ //显示报文 System.out.println(message); Pattern p = Pattern.compile("/?a=(.+) HTTP"); Matcher page = p.matcher(message); String result = ""; while(page.find()){ //System.out.println(page.group(1)); result = page.group(1); } result = URLDecoder.decode(result, "GBK"); //关键在于utf-8 OutputStreamWriter osw = new OutputStreamWriter(op,"utf-8"); osw.write("HTTP/1.1 200 OK "); osw.write("Server: Apache-Coyote/1.1 "); //osw.write("Set-Cookie: JSESSIONID=03493794995CE31A0F131787B6C6CBB2; Path=/; HttpOnly "); osw.write("Content-Type: text/html;charset=UTF-8 "); osw.write("Transfer-Encoding: chunked "); osw.write("Date: Tue, 19 May 2015 02:48:27 GMT "); osw.write(" "); osw.write("c9 "); osw.write("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> "); osw.write("<HTML> "); osw.write(" <HEAD><TITLE>A Servlet</TITLE></HEAD> "); osw.write(" <BODY> "); //osw.write(" This is myServ, using the GET method "); osw.write("你输入了 : "+result); osw.write(" </BODY> "); osw.write("</HTML> "); osw.write(" "); //osw.write("0"); osw.write(" "); osw.write(" "); osw.flush(); osw.close(); op.flush(); op.close(); } public static void doPost(String message,OutputStream op,byte [] buf) throws IOException{ //显示报文 System.out.println(message); //收取数据 new Thread(new Runnable(){ @Override public void run() { Pattern p = Pattern.compile("filename="(.+)""); Matcher page = p.matcher(message); String filename = ""; while(page.find()){ System.out.println(page.group(1)); filename = page.group(1); } File file = new File("C:\Users\binbin\Desktop\计网作业\ReciveFile"+"\"+filename); //if(!file.exists()){ try { file.createNewFile(); FileOutputStream fop = new FileOutputStream(file); fop.write(buf,556,20); fop.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //} } }).start(); //关键在于utf-8 OutputStreamWriter osw = new OutputStreamWriter(op,"utf-8"); osw.write("HTTP/1.1 200 OK "); osw.write("Server: Apache-Coyote/1.1 "); //osw.write("Set-Cookie: JSESSIONID=03493794995CE31A0F131787B6C6CBB2; Path=/; HttpOnly "); osw.write("Content-Type: text/html;charset=UTF-8 "); osw.write("Transfer-Encoding: chunked "); osw.write("Date: Tue, 19 May 2015 02:48:27 GMT "); osw.write(" "); osw.write("c9 "); osw.write("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> "); osw.write("<HTML> "); osw.write(" <HEAD><TITLE>A Servlet</TITLE></HEAD> "); osw.write(" <BODY> "); osw.write(" Post Method:UpLoad OK! "); osw.write(" </BODY> "); osw.write("</HTML> "); osw.write(" "); osw.write(" "); osw.write(" "); osw.flush(); osw.close(); op.flush(); op.close(); } public static void main(String[] args) throws IOException, InterruptedException { // 服务器监听端口号 ServerSocket serverSocket = new ServerSocket(8099); //死循环服务器一直运行 while(true){ // 等待接收请求,这是一个阻塞的方法,当请求到来的时候才会继续向下执行 Socket socket = serverSocket.accept(); // 获取请求内容 InputStream InputStream is = socket.getInputStream(); Thread.sleep(500); // 返回报文 用 OutputStream OutputStream out = socket.getOutputStream(); File file = new File("GetMetho.txt"); FileOutputStream fop = new FileOutputStream(file); //获取报文 int len = 0; byte [] buf = new byte[1024]; String message = ""; while((len=is.read(buf))!=-1){ message += new String(buf,0,len); /* if(message.contains("favicon.ico")||message.contains("google.com:443")) break; */ fop.write(buf,0,len); break; } fop.close(); //System.out.println(message); if(message.contains("favicon.ico")||message.contains("google.com:443")) continue; //如果是Post else if(message.contains("POST")){ HttpServer.doPost(message,out,buf); } //如果是Get else if(message.contains("GET")){ //System.out.println(message); HttpServer.doGet(message,out); } else; is.close(); }//end while } }
GET的html:
<html> <body> <form action="http://localhost:8099" method="get"> <input name="a" type="text" value="Hello" /> <input name="" type="submit" value="提交" /> </form> </body> </html>
POST的html:
<form action="http://localhost:8099" enctype="MULTIPART/FORM-DATA" method="POST"> <INPUT NAME="userfile1" TYPE="file"> <input type="submit" value="submit"/> </form>
POST其实是水的,因为看书里面获取上传的文件内容那段代码太长了,不想写。。就直接数了一下前面报文有多少字,直接从那后面开始读了。