java HttpServer构建http服务器_起一个好听的名字的博客-程序员宅基地

技术标签: HTTPClient  

介绍摘自网络:

   JDK6提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法

 

   我想开发一个j2se的小程序,它能接受网页传来的参数,并对传来参数做些处理。我希望这个小程序即可能接受网页传过来的参数,也能接受OutputStream流传来参数,JDK6新特性能够实现。

一、提供http服务的类

Java代码  收藏代码
  1. package com.tdt.server.httpserver;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.io.OutputStream;  
  8. import java.net.InetSocketAddress;  
  9.   
  10. import com.sun.net.httpserver.HttpExchange;  
  11. import com.sun.net.httpserver.HttpHandler;  
  12. import com.sun.net.httpserver.HttpServer;  
  13. import com.sun.net.httpserver.spi.HttpServerProvider;  
  14.   
  15. /** 
  16.  * @project SimpleHttpServer 
  17.  * @author sunnylocus 
  18.  * @vresion 1.0 2009-9-2 
  19.  * @description  自定义的http服务器 
  20.  */  
  21. public class MyHttpServer {  
  22.     //启动服务,监听来自客户端的请求  
  23.     public static void httpserverService() throws IOException {  
  24.         HttpServerProvider provider = HttpServerProvider.provider();  
  25.         HttpServer httpserver =provider.createHttpServer(new InetSocketAddress(6666), 100);//监听端口6666,能同时接 受100个请求  
  26.         httpserver.createContext("/myApp"new MyHttpHandler());   
  27.         httpserver.setExecutor(null);  
  28.         httpserver.start();  
  29.         System.out.println("server started");  
  30.     }  
  31.     //Http请求处理类  
  32.     static class MyHttpHandler implements HttpHandler {  
  33.         public void handle(HttpExchange httpExchange) throws IOException {  
  34.             String responseMsg = "ok";   //响应信息  
  35.             InputStream in = httpExchange.getRequestBody(); //获得输入流  
  36.             BufferedReader reader = new BufferedReader(new InputStreamReader(in));  
  37.             String temp = null;  
  38.             while((temp = reader.readLine()) != null) {  
  39.                 System.out.println("client request:"+temp);  
  40.             }  
  41.             httpExchange.sendResponseHeaders(200, responseMsg.length()); //设置响应头属性及响应信息的长度  
  42.             OutputStream out = httpExchange.getResponseBody();  //获得输出流  
  43.             out.write(responseMsg.getBytes());  
  44.             out.flush();  
  45.             httpExchange.close();                                 
  46.               
  47.         }  
  48.     }  
  49.     public static void main(String[] args) throws IOException {  
  50.         httpserverService();  
  51.     }  
  52. }  

 

二、测试类

Java代码  收藏代码
  1. package com.tdt.server.test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.io.OutputStream;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.URL;  
  10. import java.util.concurrent.ExecutorService;  
  11. import java.util.concurrent.Executors;  
  12.   
  13. /** 
  14.  * @project SimpleHttpServer 
  15.  * @author sunnylocus 
  16.  * @vresion 1.0 2009-9-2 
  17.  * @description 测试类   
  18.  */  
  19. public class Test {  
  20.     public static void main(String[] args) {  
  21.         ExecutorService exec = Executors.newCachedThreadPool();  
  22.         // 测试并发对MyHttpServer的影响  
  23.         for (int i = 0; i < 20; i++) {  
  24.             Runnable run = new Runnable() {  
  25.                 public void run() {  
  26.                     try {  
  27.                         startWork();  
  28.                     } catch (IOException e) {  
  29.                         e.printStackTrace();  
  30.                     }  
  31.                 }  
  32.             };  
  33.             exec.execute(run);  
  34.         }  
  35.         exec.shutdown();// 关闭线程池  
  36.     }  
  37.   
  38.     public static void startWork() throws IOException {  
  39.         URL url = new URL("http://127.0.0.1:6666/myApp");  
  40.         HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
  41.         urlConn.setDoOutput(true);  
  42.         urlConn.setDoInput(true);  
  43.         urlConn.setRequestMethod("POST");  
  44.         // 测试内容包  
  45.         String teststr = "this is a test message";  
  46.         OutputStream out = urlConn.getOutputStream();  
  47.         out.write(teststr.getBytes());  
  48.         out.flush();  
  49.         while (urlConn.getContentLength() != -1) {  
  50.             if (urlConn.getResponseCode() == 200) {  
  51.                 InputStream in = urlConn.getInputStream();  
  52.                 BufferedReader reader = new BufferedReader(new InputStreamReader(in));  
  53.                 String temp = "";  
  54.                 while ((temp = reader.readLine()) != null) {  
  55.                     System.err.println("server response:" + temp);// 打印收到的信息  
  56.                 }  
  57.                 reader.close();  
  58.                 in.close();  
  59.                 urlConn.disconnect();  
  60.             }  
  61.         }  
  62.     }  
  63. }  

 

注意:经过我测试发现httpExchange.sendResponseHeaders(200, responseMsg.length())有bug,如果responseMsg里面包含中文的话,客户端不会收到任何信息,因为一个汉字用二个字节表示。

应修改为:

httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, responseMsg.getBytes().length);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29663071/article/details/52385411

智能推荐

Windows和PyCharm常用快捷键_Le0v1n的博客-程序员宅基地

Windows这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义.这是一行测试语言, 没有其他的含义.Shiftshift, 又名换挡键, 一般是Shift + 其他按键多选Shift + ←/→可以实现选中文字按下shift + →多按几次shift + →Shift + 鼠标

MATLAB WRanksum test,python与Matlab的ranksum等价物是什么?_f飞姐的博客-程序员宅基地

这取决于您使用的选项。检查以下示例:1-MATLABrng('default') % for reproducibilityx = unifrnd(0,1,20,1);y = unifrnd(0.25,1.25,20,1);p = ranksum(x,y);p =0.25032-Python(为了保持一致,我没有再次生成数字,但是我已经将MATLAB中生成的数字移动到Python脚本中)^{pr2...

linux命令管道工作原理与使用方法_weixin_34198762的博客-程序员宅基地

一、管道定义管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,具有以下特点:*** 数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建 立两个管道。*** 管道只能用于父子进程或者兄弟进程间通信。,也就是说管道只能用...

python生成带有调用第三方库的exe可执行文件_起个名字都难啊的博客-程序员宅基地_python打包exe 带第三方库

python代码生成exe的工具有多种,以pyinstaller为例:python代码中含有第三方库,比如opencv时,需要指定库的路径,这会使pyinstaller将库打包进生成的exe中,否则运行exe时会出现缺少xxx库。指令:pyinstaller -F -w -i skull.ico -p "D:\install file\python3.7.9\Lib\site-packages" test22.py参数 含义-F 指定打包后只生成一个exe格式的文件-D 创建一个目

java git打包iOS_Jenkins实现iOS项目自动化打包(含踩坑记录)_weixin_39955781的博客-程序员宅基地

一、前言这段时间一直在参与开发前端项目。与iOS工作流程不同的是,前端给QA提测前,只需将feature分支代码合到一个指定的分支。然后QA人员会通过Jenkins工具进行项目的构建部署。之前在探索iOS的自动化打包时,就听过Jenkins的大名,但是一直没去了解。这次借此机会由最擅长的iOS项目为切入点,开始对Jenkins的探索。二、安装Jenkins**Jenkins**依赖了Java环境,...

Web开发(初级)- HTML基础_weixin_33721344的博客-程序员宅基地

HTML简介 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记)。相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器根据标记语言的规则去解释它。浏览器负责将标签翻译成用户“看得懂”的格式,呈现给用户!(例:django模版引擎)HTML文档Doctype&lt;!DOCTYPEh...

随便推点

用计算机管理学生成绩,北京计算机大学组织专家对《学生成绩管理系统》的需求方案进行评审,为使参会人员对会议流程和内容有一个清晰的了解_题来了..._weixin_39770226的博客-程序员宅基地

步骤1:打开考生文件夹下的“需求评审会.docx”素材文件。步骤2:根据题目要求,单击【文件】选项卡下的“另存为”按钮,弹出“另存为”对话框,在该对话框中将“文件名”设置为“评审会会议秩序册”,将其保存于考生文件夹下。(2)【解题步骤】考点提示:本题主要考核页面格式的设置。步骤1:单击【页面布局】选项卡下的【页面设置】组中的对话框启动器按钮。弹出“页面设置”对话框,切换至“纸张”选项卡,在“纸张大...

H5移动端页面加入canvas可滑动代码条件下android手机点击input重复弹出键盘_weixin_34072159的博客-程序员宅基地

在移动端页面使用canvas的动画,为了实现动画的触摸滑动,会加入createjs.Touch.enable(stage, true, false)这条语句,但加入这条语句后,页面的input和click等可点击事件都会失效,所以会用触摸事件来实现相关功能,如下:$('#button').on('touchstart', functio...

PTA(2019年天梯赛-全国总决赛)----彩虹瓶 (25分)_0k-ok的博客-程序员宅基地

旧人旧事更值得怀念,或悲或喜每个人身上都承载着某一段时光,但是我会永远清澈永远疯狂永远浪漫。没有人能回到过去重新活过,但你我都可以从现在开始,决定我们未来的模样。---...

递归、分治、动态规划_weixin_39030846的博客-程序员宅基地

递归、分治、动态规划一、递归(Recursion)二、分治(Divide &amp; Conquer)三、动态规划(Dynamic Programming)四、总结:一、递归(Recursion)public void recur(int level, int param) { // terminator if (level &gt; MAX_LEVEL) { // process result return; } // process curren

基于Linux的操作系统 MeeGo_weixin_33826609的博客-程序员宅基地

MeeGo是开放源码的Linux项目,它把由Intel牵头的Moblin项目跟Nokia领导的Maemo项目结合到单一的开源实践中。它包含了性能 优化,可供面向计算和图形的应用及连接服务的开发的组件,对互联网标准的支持,基于Qt的易于使用的开发环境,以及面向小型平台及移动设备的规模和性能而 优化的最新的Linux架构。MeeGo目前适用的平台包括上网本、简易台式机、手持计算和...

10分钟看懂《人类简史》和《未来简史》_CGGAO的博客-程序员宅基地

https://mp.weixin.qq.com/s?__biz=MzA5NzIxMDUyNg==&amp;mid=2649974252&amp;idx=2&amp;sn=784682583270884c8c9ea3265c023212&amp;chksm=88a39c1dbfd4150b71ae8dca891e800ab5f10b6f69ec0f27720d9c5dbfbda871c013c28...

推荐文章

热门文章

相关标签