java http服务端例子_简单的用 Java Socket 编写的 HTTP 服务器应用
/*** SimpleHttpServer.java*/importjava.io.*;importjava.net.*;importjava.util.StringTokenizer;/*** 一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及 * 给客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码. * 首先运行这个程序,然后打开Web浏览器,键入http://localhost,则这个程序能够显示出浏览器发送了那些信息 * 并且向浏览器返回一个网页和一副图片, 并测试同浏览器对话. * 当浏览器看到 HTML 中带有图片地址时, 则会发出第二次连接来请求图片等资源. * 这个例子可以帮您理解 Java 的 HTTP 服务器软件是基于 J2SE 的 Socket 等软件编写的概念, 并熟悉 * HTTP 协议. * 相反的用 Telnet 连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返回内容. * *
* 当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80. * 随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为: * * { : }* * * { Entity Body } * 请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等. * 在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等. * 在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个/n之后是请求消息的消息实体(Entity Body).具体的例子参看httpRequest.txt. * Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为: * [] * { : } * * * { Entity Body } * 应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类: * 参看:HTTP应答码及其意义 * * 1XX 保留 * 2XX 表示成功 * 3XX 表示URL已经被移走 * 4XX 表示客户错误 * 5XX 表示服务器错误 * 例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等. * 在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始. * 下面是一个应答消息的例子: * HTTP/1.0 200 OK * Date: Moday,07-Apr-97 21:13:02 GMT * Server:NCSA/1.1 * MIME_Version:1.0 * Content_Type:text/html * Last_Modified:Thu Dec 5 09:28:01 1996 * Coentent_Length:3107 * *
* * 在用Java语言实现HTTP服务器时,首先启动一个java.net.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用String.getBytes()方法转换为字节数组返回,或者使用PrintStream的print()方法写入文本,用write(byte[])方法写入二进制数据. * *
*@author刘长炯 *@version1.0 2007-07-24 Sunday*/publicclassSimpleHttpServerimplementsRunnable {/****/ServerSocket serverSocket;//服务器Socket/*** 服务器监听端口, 默认为 80.*/publicstaticintPORT=80;//标准HTTP端口/*** 开始服务器 Socket 线程.*/publicSimpleHttpServer() {try{ serverSocket=newServerSocket(PORT); }catch(Exception e) { System.out.println("无法启动HTTP服务器:"+e.getLocalizedMessage()); }if(serverSocket==null) System.exit(1);//无法开始服务器newThread(this).start(); System.out.println("HTTP服务器正在运行,端口:"+PORT); }/*** 运行服务器主线程, 监听客户端请求并返回响应.*/publicvoidrun() {while(true) {try{ Socket client=null;//客户Socketclient=serverSocket.accept();//客户机(这里是 IE 等浏览器)已经连接到当前服务器if(client!=null) { System.out.println("连接到服务器的用户:"+client);try{//第一阶段: 打开输入流BufferedReader in=newBufferedReader(newInputStreamReader( client.getInputStream())); System.out.println("客户端发送的请求信息:/n***************");//读取第一行, 请求地址String line=in.readLine(); System.out.println(line); String resource=line.substring(line.indexOf('/'),line.lastIndexOf('/')-5);//获得请求的资源的地址resource=URLDecoder.decode(resource,"UTF-8");//反编码 URL 地址String method=newStringTokenizer(line).nextElement().toString();//获取请求方法, GET 或者 POST//读取所有浏览器发送过来的请求参数头部信息while( (line=in.readLine())!=null) { System.out.println(line);if(line.equals(""))break; }//显示 POST 表单提交的内容, 这个内容位于请求的主体部分if("POST".equalsIgnoreCase(method)) { System.out.println(in.readLine()); } System.out.println("请求信息结束/n***************"); System.out.println("用户请求的资源是:"+resource); System.out.println("请求的类型是:"+method);//GIF 图片就读取一个真实的图片数据并返回给客户端if(resource.endsWith(".gif")) { fileService("images/test.gif", client); closeSocket(client);continue; }//请求 JPG 格式就报错 404if(resource.endsWith(".jpg")) { PrintWriter out=newPrintWriter(client.getOutputStream(),true); out.println("HTTP/1.0 404 Not found");//返回应答消息,并结束应答out.println();//根据 HTTP 协议, 空行将结束头信息out.close(); closeSocket(client);continue; }else{//用 writer 对客户端 socket 输出一段 HTML 代码PrintWriter out=newPrintWriter(client.getOutputStream(),true); out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答out.println("Content-Type:text/html;charset=GBK"); out.println();//根据 HTTP 协议, 空行将结束头信息out.println("
Hello Http Server
"); out.println("你好, 这是一个 Java HTTP 服务器 demo 应用.
"); out.println("您请求的路径是:"+resource+"
"); out.println("这是一个支持虚拟路径的图片:
"+"点击打开abc.gif, 是个服务器虚拟路径的图片文件."); out.println("
这是个会反馈 404 错误的的图片:点击打开test.jpg
"); out.println("POST 表单 "); out.close(); closeSocket(client); } }catch(Exception e) { System.out.println("HTTP服务器错误:"+e.getLocalizedMessage()); } }//System.out.println(client+"连接到HTTP服务器");//如果加入这一句,服务器响应速度会很慢}catch(Exception e) { System.out.println("HTTP服务器错误:"+e.getLocalizedMessage()); } } }/*** 关闭客户端 socket 并打印一条调试信息. *@paramsocket 客户端 socket.*/voidcloseSocket(Socket socket) {try{ socket.close(); }catch(IOException ex) { ex.printStackTrace(); } System.out.println(socket+"离开了HTTP服务器"); }/*** 读取一个文件的内容并返回给浏览器端. *@paramfileName 文件名 *@paramsocket 客户端 socket.*/voidfileService(String fileName, Socket socket) {try{ PrintStream out=newPrintStream(socket.getOutputStream(),true); File fileToSend=newFile(fileName);if(fileToSend.exists()&&!fileToSend.isDirectory()) { out.println("HTTP/1.0 200 OK");//返回应答消息,并结束应答out.println("Content-Type:application/binary"); out.println("Content-Length:"+fileToSend.length());//返回内容字节数out.println();//根据 HTTP 协议, 空行将结束头信息FileInputStream fis=newFileInputStream(fileToSend);bytedata[]=newbyte[fis.available()]; fis.read(data); out.write(data); out.close(); fis.close(); } }catch(Exception e) { System.out.println("传送文件时出错:"+e.getLocalizedMessage()); } }/*** 打印用途说明.*/privatestaticvoidusage() { System.out.println("Usage: java HTTPServer /nDefault port is 80."); }/*** 启动简易 HTTP 服务器 *@paramargs*/publicstaticvoidmain(String[] args) {try{if(args.length!=1) { usage(); }elseif(args.length==1) { PORT=Integer.parseInt(args[0]); } }catch(Exception ex) { System.err.println("Invalid port arguments. It must be a integer that greater than 0"); }newSimpleHttpServer(); } }
java http服务端例子_简单的用 Java Socket 编写的 HTTP 服务器应用相关推荐
- java cxf服务端_webservice概述及cxf在Java开发中应用(二) 简单搭建cxf服务端
首先我们下载cxf的jar包,我这里下载的是apache-cxf-3.0.4这个版本,目前最新的. Eclipse里面新建一个Java project,在工程中引入需要的jar: 这些包里面包含了je ...
- java cxf服务端代码_【JAVA】 cxf 生成 webservice 服务端代码
CXF Apache CXF = Celtix + XFire.CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding . ...
- java网格布袋布局例子_我的世界Java版 20w45a 发布 加入收纳袋,蜡烛,望远镜等全新道具...
心急吃不了热豆腐,不过相信大家已经等了够久了.第一个「地洞山崖」快照终于来到Minecraft Java版了!相信各位玩家跟我们一样激动,因为这款快照内加入了大量的新特性,还有一些对现存特性的改动,以 ...
- Java web 服务器 搭建_搭建一个java web服务端
最近也是做了一个简单的java web 项目,由于以前也是没接触过,在这里记录下搭建一个web服务端的过程. 一般我们做一个服务端要么在本地自己的电脑上先安装环境,一般是windows系统,主要安装j ...
- java游戏服务端实现
java游戏服务端实现 一个多人在线的棋牌类网络游戏的项目临近尾声,我参与了该项目的整个设计流程,并且完成了90%的核心代码.关于这个项目,有很多地方值得聊一聊.本系列不打算把这个项目将得多么详 ...
- java做服务端,FLASH做客户端交互总结
经过大概2周的时间,做完了1个JAVA做服务器FLASH做客户端的交互例子.期间碰到些麻烦事,总结下做个记录. 1.安全域问题,当服务器在本地启动的时候,如果没有进行对应配置直接让FLASH访问服务器 ...
- java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端
前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...
- c++socket多个客户端通过不同端口与一个服务端通信_手写RPC,深入底层理解整个RPC通信...
一.前言 RPC,远程过程调用,调用远程方法像调用本地方法一样.RPC交互分为客户端和服务端,客户端调用服务端方法,服务端接收数据并打印到控制台,并response响应给客户端. RPC和HTTP的联 ...
- MSDN上的异步socket 服务端例子
MSDN上的异步socket 服务端例子 2006-11-22 17:12:01| 分类: 代码学习 | 标签: |字号大中小 订阅 Imports System Imports System.N ...
最新文章
- dev c++ 调试时候发生软件崩溃解决办法
- Struts 2创始人Patrick Lightbody看《精通Struts 2:Web 2.0开发实战 》
- 软件测试工具按用途分分为哪几类,以测试的形态分软件测试可以分为哪几类?...
- JMeter基础知识
- Rambus推出面向下一代数据中心的PCIe 6.0控制器
- 前后端分离 基于SpringBoot+mybatis+Java Mail+Lay UI+Ajax 的班级管理系统(webapp +安卓应用)
- Tap titans乐趣
- 如何搭建企业大数据分析平台
- JSP开发工具安装教程
- MacBook安装jdk8
- 陈佼每周一蛋疼:“哼唱搜索”更像是个玩具
- 教你自己搭建一个ip池(绝对超好用!!!!)
- Android系统裁剪 apk
- 教大家做蛋黄酥的做法
- python实现分词和词云制作
- HDU-1014 线性同余法
- 2.4 导集,闭集,闭包
- [AcWing] 905. 区间选点(C++实现)贪心---区间问题例题
- 自考哪些专业不考英语跟计算机,深圳自考有哪些专业?并且可以不考“数学”和“英语”!...
- Java找不到目标文件,java-构建后生成的目标文件不包含必须已经...