Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30101343
  • 博文数量: 230
  • 博客积分: 2868
  • 博客等级: 少校
  • 技术积分: 2223
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-08 21:48
个人简介

Live & Learn

文章分类

全部博文(230)

文章存档

2022年(2)

2019年(5)

2018年(15)

2017年(42)

2016年(24)

2015年(13)

2014年(1)

2012年(5)

2011年(58)

2010年(56)

2009年(9)

我的朋友

分类: 嵌入式

2010-11-11 17:39:05

关键字: 一个简单的socket实现的http响应服务器(get/post/upload)

  1. package test.io;   
  2.   
  3. import java.net.*;   
  4. import java.io.*;   
  5.   
  6. /**  
  7.  * 一个简单的Socket实现的HTTP响应服务器。
     
     
  8.  * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。  
  9.  *   
  10.  * @author 赵学庆  
  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(""  
  69.               + "
    "  
  70.               + "

    HTTP协议测试服务器,当前时间:"  

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

    HTTP协议测试服务器,当前时间:"  

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

    HTTP协议测试服务器,当前时间:"  

  70.               + new java.util.Date()  
  71.               + ""  
  72.               + "username:password:
    "
      
  73.               + "username:password:
    "
      
  74.               + "phototitle:photo:"  
  75.               + "您提交的数据如下:
    " + msg.toString() + "
    "
    );  
  76.       out.flush();  
  77.       out.close();  
  78.       is.close();  
  79.       System.out.println("close");  
  80.       // 关闭连接  
  81.       socket.close();  
  82.     } catch (IOException e) {  
  83.       e.printStackTrace();  
  84.     }  
  85.   }  
  86. }  



运行结果 
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:



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:
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:
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--


    WebServer的实现就是HTTP通信的过程。其中包括服务器和浏览器的以下几个步骤。
    (1)建立TCP连接。建立一个TCP连接,对80端口(WebServer默认端口)进行监听,接收到TCP包后即进入TCP回调函数。
    (2)Web浏览器向Web服务器发送请求命令。一旦建立了连接,浏览器即向服务器发送请求命令。请求消息包括请求行,首部,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。例如:
    GET/index.html HTTP/1.1
    (3)Web服务器响应。客户机向服务器发出请求后,服务器会客户机回送响应。响应消息包括状态行、响应头、空行及实体内容。在响应报文中,包括协议版本号和应答状态码,关于它自己的数据及被请求的文档信息。例如:
    HTTP/1.1 200 OK 
  Content-type:text/html
    (4)关闭连接。数据传送完毕,双方通过4次握手,结束TCP/IP连接
阅读(16260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~