`
逆风的香1314
  • 浏览: 1390065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Socket实现的HTTP协议查看器(GET/POST/UPLOAD)

阅读更多

本文用于初学者熟悉Http协议的一些细节,特别是常见的GET/POST(Upload)三种表单提交方式的数据格式。
原文地址:http://www.java2000.net/p9925

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

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

普通POST的结果演示
  1. POST /?username=111&password=222 HTTP/1.1
  2. Host: 127.0.0.1:8000
  3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: zh-cn,zh;q=0.5
  6. Accept-Encoding: gzip,deflate
  7. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
  8. Keep-Alive: 300
  9. Connection: keep-alive
  10. Referer: http://127.0.0.1:8000/?username=111&password=222
  11. Content-Type: application/x-www-form-urlencoded
  12. Content-Length: 25
  13. username=111&password=222

POST文件上传的结果演示
  1. POST /?username=111&password=222 HTTP/1.1
  2. Host: 127.0.0.1:8000
  3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: zh-cn,zh;q=0.5
  6. Accept-Encoding: gzip,deflate
  7. Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
  8. Keep-Alive: 300
  9. Connection: keep-alive
  10. Referer: http://127.0.0.1:8000/?username=111&password=222
  11. Content-Type: multipart/form-data; boundary=---------------------------23757983230932
  12. Content-Length: 1704
  13. -----------------------------23757983230932
  14. Content-Disposition: form-data; name="phototitle"
  15. 12
  16. -----------------------------23757983230932
  17. Content-Disposition: form-data; name="photo"filename="技术考核题.txt"
  18. Content-Type: text/plain
  19. 技术考核
  20. 本次是个编程题,题目选Java/语言进行回答。
  21. 问题描述:
  22. 假设你的爱好是集邮。目前总共有N种不同的邮票,编号为从0到N-1.每种邮票的价钱被定义在数组int[] prices中(序号从0开始,数组的第i个元素表示第i种邮票的价格)。
  23. 你的目标是收集尽可能多种的邮票。你当前拥有的邮票存储在int[] have这个数组中。初始时,你没有钱,但是你可以卖掉已有邮票来买不同的邮票。返回你能收集到的不同种邮票的最大数量。
  24. 定义:
  25. class: PostmarksCollection
  26. method: numberOfDistinctPostmarks
  27. Parameters: int[], int[]
  28. Returns: int
  29. Method signature: public int numberOfDistinctPostmarks(int[] prices, int[] have)
  30. //为了进行测试,必须保证是public
  31. 约束:
  32. 1) N从1到50
  33. 2)prices中的元素数量刚好是N个元素
  34. 3)prices中的元素的值,从1到1,000,000
  35. 4)have中的元素数量是0个到N个
  36. 5)have中的每个元素是不同的
  37. 6)have中的每个元素的值是从0到N-1.
  38. 例如:
  39. 1)
  40. {13,10,14,20}
  41. {3,0,2,1}
  42. Returns: 4
  43. 你已经拥有所有种类的邮票。
  44. 2)
  45. {7,5,9,7}
  46. {}
  47. Returns: 0
  48. 你开始没有任何邮票,所以你也不能组任何事情。
  49. 3)
  50. {4,13,9,1,5}
  51. {1,3,2}
  52. Returns: 4
  53. 卖掉邮票2,买入邮票0和4,(邮票2的价钱是9,邮票0的价钱是4,邮票4的价钱是5,卖掉2刚好买入0和4)
  54. 4)
  55. {16,32,13,2,17,10,8,8,20,17}
  56. {7,0,4,1,6,8}
  57. Returns: 8
  58. --------------------------------------------------------------------------------
  59. 使用Java请在此处答题(请使用JDK5.0编译,编译不能通过者不计算分数)
  60. -----------------------------23757983230932--

总结:
  初学者要提高自己的编程水平,熟悉一下常用的协议是必须的。

分享到:
评论

相关推荐

    C# 后台 使用Http协议获取GET / 推送POST 数据的通用类

    C# 后台 使用Http协议获取GET / 推送POST 数据的通用类

    HTTP协议调试器

    中文:HTTP协议调试器英文:Http/Https Protocol Debuger版权:电猫工作室(EMouze)1.支持HTTP和HTTPS(SSL加密)网络协议的跟踪和调试。2.可以查看到HTTP/HTTPS协议连接的详细过程和返回结果。3.允许GET/POST/HEAD/PUT...

    基于Socket接口实现自定义协议聊天室

    基于Socket接口实现的自定义协议聊天室 C/S架构,可实现多对多聊天 也可在我的github仓库 https://github.com/yunwei37/myClassNotes 下载和查看具体说明

    计网大作业,用java原生socket实现简单的http协议

    get请求成功后,如果是非文本类型的文件,会存储在clientResources目录下,如果在idea的project面板可能无法立即看到,请在explore中打开目录查看。 例: get /DeepColor.png 1.1 host localhost e send 如何post...

    Http/Https Protocol Debuger HTTP协议调试器

    1.支持HTTP和HTTPS(SSL加密)网络协议的...3.允许GET/POST/HEAD/PUT四种连接方式。 4.支持HTTP的Proxy代理。 5.自动处理重定向Redirect功能。 6.自动处理Cookie的接收和发送。 7.可以自行设置和增加HTTP请求命令的参数。

    PB9实现的SOCKET通讯协议

    PB9实现的SOCKET通讯协议,已打包成EXE等可执行文件,也直接运行查看,同时提供完整的源码;

    REST模拟GET,POST,PUT,DELETE请求工具

    测试接口,模拟POST,GET,PUT,DELETE提交的工具

    TamperIE篡改GET和/或POST

    这是来自Bayden系统的浏览器辅助对象。它非常简单,只有两个选项——篡改GET和/或POST。当我们提交这样的请求时,该工具会自动阻断提交,我们可以查看和修改我们提交的信息。这是单单使用IE地址栏所不能完成的内容。

    pc与android通过usb socket实现手机通信Demo

    a.PC客户端与Android服务端的Socket同步通信(USB) b.操作步骤如下: ----------------------------------------------------------- 1.请将测试数据文件夹中的ucliulanqi.apk copy到c:\下进行测试 2. 将android...

    Hp-Socket For E 5.4.2 高性能TCP/UDP通信组件 源码+模块+例程-易语言

    也不多说,增加了N多功能,终结了N多"特性"(具体请查看5.3.2版本后的日志)。 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/...

    sql文件查看器sql文件查看器

    sql文件查看器sql文件查看器sql文件查看器sql文件查看器sql文件查看器

    ServletContextListener socket实现数据接收

    通过创建ServletContextListener监听器,socket来实现tcp/ip协议客户端数据的接收功能。这是一个maven项目,直接导入eclipse即可运行,此处监听的是9092端口,将项目运行起后,可以对其端口使用情况进行查看,在...

    STP/STEP/STL文件查看器

    STP/STEP/STL文件查看器,应用小巧紧紧22M,支持测量,旋转,文件导出导入,查看方便不用再安装其他大的软件,亲测可用

    C#实现Windows中图片查看器的功能

    该示例演示了如何使用C#来实现一个图片查看器的功能.该示例包含的功能有: 可以通过“上一张” “下一张”这样的按钮来轮换浏览图片 实现对图片的旋转 实现对旋转后图片的保存功能。

    Http代理服务-协议查看器

    HTTP代理服务器,通过它的所有HTTP代理连接协议都可以查看和分析,用于分析HTTP协议和数据的好工具,支持HTTPS协议,但没法查看真实内容 帮助请看 http://blog.csdn.net/flashcom/article/details/6894639

    HTTPDebugger 中文版 8.3

    本次汉化升级到 HTTP Debugger 8.3 ...3.允许GET/POST/HEAD/PUT四种连接方式。 4.支持HTTP的Proxy代理。 5.自动处理重定向Redirect功能。 6.自动处理Cookie的接收和发送。 7.可以自行设置和增加HTTP请求命令的参数。

    使用element-ui的upload组件实现上传图片和pdf可查看方法

    使用element-ui的upload组件实现上传图片和pdf可查看方法

    java实现远程桌面程序socket版

    源码分服务端与客户端,源码已分离,可直接用IDEA直接打开,其他IDE稍做修改就行,源码不依赖其他JAR包,所以容量很小,服务端主窗口为表格,...查看效果图:http://www.cncncc.com/article/view/article_1_826.html

    易语言-Hp-Socket For E 5.4.2 高性能TCP/UDP通信组件 源码+模块+例程

    HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。 为了让使用者能方便快速地学习和使用 HP-Socket ,迅速...

    POST/GET请求测试工具源码

    POST及GET请求测试工具源码,可以查看返回值数据。C#代码开发,VS打开即可。

Global site tag (gtag.js) - Google Analytics