一个简单的Socket实现的HTTP响应服务器(GET/POST/UPLOAD)

  1. package test.io;   
  2.   
  3. import java.net.*;   
  4. import java.io.*;   
  5.   
  6. /**  
  7.  * 一个简单的Socket实现的HTTP响应服务器。<br>  
  8.  * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。  
  9.  *   
  10.  * @author 赵学庆 www.java2000.net  
  11.  */  
  12. public class MyWebServer {   
  13.   public static void main(String[] args) {   
  14.     Socket socket = null;   
  15.     try {   
  16.       // 创建一个监听8000端口的服务器Socket   
  17.       ServerSocket s = new ServerSocket(80003);   
  18.       System.out.println("MyWebServer等待来自浏览器的连接\n");   
  19.       while (true) {   
  20.         socket = s.accept();   
  21.         System.out.println("连接已建立。端口号:" + socket.getPort());   
  22.         new MyWebServerThread(socket).start();   
  23.       }   
  24.     } catch (IOException e) {   
  25.       e.printStackTrace();   
  26.     }   
  27.   }   
  28. }   
  29.   
  30. class MyWebServerThread extends Thread {   
  31.   private Socket socket;   
  32.   
  33.   MyWebServerThread(Socket socket) {   
  34.     this.socket = socket;   
  35.   }   
  36.   
  37.   @Override  
  38.   public void run() {   
  39.     try {   
  40.       InputStreamReader is = new InputStreamReader(socket.getInputStream());   
  41.       char[] bs = new char[2048];   
  42.       PrintStream out;   
  43.       out = new PrintStream(socket.getOutputStream());   
  44.       StringBuilder msg = new StringBuilder();   
  45.       // 如果10毫秒还没有数据,则视同没有新的数据了。   
  46.       // 因为有Keep-Alive的缘故,浏览器可能不主动断开连接的。   
  47.       // 实际应用,会根据协议第一行是GET还是 POST确定。   
  48.       socket.setSoTimeout(10);   
  49.       //   
  50.       // 此处读入请求数据并做相应的处理   
  51.       //   
  52.       int len = -1;   
  53.       try {   
  54.         while ((len = is.read(bs)) != -1) {   
  55.           msg.append(bs, 0, len);   
  56.           msg.append("\n");   
  57.         }   
  58.       } catch (Exception ex) {   
  59.         // ex.printStackTrace();   
  60.       }   
  61.       // 下面是由服务器直接生成的主页内容   
  62.       // 1、首先向浏览器输出响应头信息   
  63.       out.println("HTTP/1.1 200 OK");   
  64.       out.println("Content-Type:text/html;charset:GBK");   
  65.       out.println();   
  66.       // 2、输出主页信息   
  67.       out   
  68.           .println("<HTML><BODY>"  
  69.               + "<center>"  
  70.               + "<H1>HTTP协议测试服务器,当前时间:"  
  71.               + new java.util.Date()   
  72.               + "</h1>"  
  73.               + "<form method='get'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='GET测试'/></form><br/>"  
  74.               + "<form method='post'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='POST测试'/></form><br/>"  
  75.               + "<form method='post'  enctype='multipart/form-data'>phototitle:<input type='text' name='phototitle'/>photo:<input type='file' name='photo'/><input type='submit' value='Upload测试'/></form>"  
  76.               + "</center>您提交的数据如下:<pre>" + msg.toString() + "</pre></BODY></HTML>");   
  77.       out.flush();   
  78.       out.close();   
  79.       is.close();   
  80.       System.out.println("close");   
  81.       // 关闭连接   
  82.       socket.close();   
  83.     } catch (IOException e) {   
  84.       e.printStackTrace();   
  85.     }   
  86.   }   
  87. }  
package test.io;

import java.net.*;
import java.io.*;

/**
 * 一个简单的Socket实现的HTTP响应服务器。<br>
 * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。
 * 
 * @author  */
public class MyWebServer {
  public static void main(String[] args) {
    Socket socket = null;
    try {
      // 创建一个监听8000端口的服务器Socket
      ServerSocket s = new ServerSocket(8000, 3);
      System.out.println("MyWebServer等待来自浏览器的连接\n");
      while (true) {
        socket = s.accept();
        System.out.println("连接已建立。端口号:" + socket.getPort());
        new MyWebServerThread(socket).start();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

class MyWebServerThread extends Thread {
  private Socket socket;

  MyWebServerThread(Socket socket) {
    this.socket = socket;
  }

  @Override
  public void run() {
    try {
      InputStreamReader is = new InputStreamReader(socket.getInputStream());
      char[] bs = new char[2048];
      PrintStream out;
      out = new PrintStream(socket.getOutputStream());
      StringBuilder msg = new StringBuilder();
      // 如果10毫秒还没有数据,则视同没有新的数据了。
      // 因为有Keep-Alive的缘故,浏览器可能不主动断开连接的。
      // 实际应用,会根据协议第一行是GET还是 POST确定。
      socket.setSoTimeout(10);
      //
      // 此处读入请求数据并做相应的处理
      //
      int len = -1;
      try {
        while ((len = is.read(bs)) != -1) {
          msg.append(bs, 0, len);
          msg.append("\n");
        }
      } catch (Exception ex) {
        // ex.printStackTrace();
      }
      // 下面是由服务器直接生成的主页内容
      // 1、首先向浏览器输出响应头信息
      out.println("HTTP/1.1 200 OK");
      out.println("Content-Type:text/html;charset:GBK");
      out.println();
      // 2、输出主页信息
      out
          .println("<HTML><BODY>"
              + "<center>"
              + "<H1>HTTP协议测试服务器,当前时间:"
              + new java.util.Date()
              + "</h1>"
              + "<form method='get'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='GET测试'/></form><br/>"
              + "<form method='post'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='POST测试'/></form><br/>"
              + "<form method='post'  enctype='multipart/form-data'>phototitle:<input type='text' name='phototitle'/>photo:<input type='file' name='photo'/><input type='submit' value='Upload测试'/></form>"
              + "</center>您提交的数据如下:<pre>" + msg.toString() + "</pre></BODY></HTML>");
      out.flush();
      out.close();
      is.close();
      System.out.println("close");
      // 关闭连接
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}



运行结果
GET方法

引用:
GET /?username=111&password=222 HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8000/?username=1&password=2



POST方法

引用:
POST /?username=111&password=222 HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8000/?username=111&password=222
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

username=111&password=222



UPLOAD

引用:
POST /?username=111&password=222 HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8000/?username=111&password=222
Content-Type: multipart/form-data; boundary=---------------------------23757983230932
Content-Length: 1704

-----------------------------23757983230932
Content-Disposition: form-data; name="phototitle"

12
-----------------------------23757983230932
Content-Disposition: form-data; name="photo"; filename="技术考核题.txt"
Content-Type: text/plain

技术考核
本次是个编程题,题目选Java/语言进行回答。

 
问题描述:
假设你的爱好是集邮。目前总共有N种不同的邮票,编号为从0到N-1.每种邮票的价钱被定义在数组int[] prices中(序号从0开始,数组的第i个元素表示第i种邮票的价格)。
你的目标是收集尽可能多种的邮票。你当前拥有的邮票存储在int[] have这个数组中。初始时,你没有钱,但是你可以卖掉已有邮票来买不同的邮票。返回你能收集到的不同种邮票的最大数量。
 
定义:
class: PostmarksCollection
method: numberOfDistinctPostmarks
Parameters: int[], int[]
Returns: int
 
Method signature: public int numberOfDistinctPostmarks(int[] prices, int[] have)
 //为了进行测试,必须保证是public
 
约束:
1) N从1到50
2)prices中的元素数量刚好是N个元素
3)prices中的元素的值,从1到1,000,000
4)have中的元素数量是0个到N个
 
5)have中的每个元素是不同的
6)have中的每个元素的值是从0到N-1.
 
例如:
1)
{13,10,14,20}
{3,0,2,1}
Returns: 4
你已经拥有所有种类的邮票。
 
2)
{7,5,9,7}
{}
Returns: 0
你开始没有任何邮票,所以你也不能组任何事情。
 
3)
{4,13,9,1,5}
{1,3,2}
Returns: 4
卖掉邮票2,买入邮票0和4,(邮票2的价钱是9,邮票0的价钱是4,邮票4的价钱是5,卖掉2刚好买入0和4)
 
4)
 
{16,32,13,2,17,10,8,8,20,17}
{7,0,4,1,6,8}
Returns: 8

--------------------------------------------------------------------------------



  使用Java请在此处答题(请使用JDK5.0编译,编译不能通过者不计算分数)

-----------------------------23757983230932--
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值