Java 如何实现一个http服务器
程序员文章站
2022-04-20 07:56:00
在java中可以使用httpserver类来实现http服务器,该类位于com.sun.net包下(rt.jar)。实现代码如下:主程序类package bg.httpserver;import co...
在java中可以使用httpserver类来实现http服务器,该类位于com.sun.net包下(rt.jar)。实现代码如下:
主程序类
package bg.httpserver; import com.sun.net.httpserver.httpserver; import java.io.ioexception; import java.net.inetsocketaddress; import java.util.concurrent.executors; public class httpserverstarter { public static void main(string[] args) throws ioexception { //创建一个httpserver实例,并绑定到指定的ip地址和端口号 httpserver httpserver = httpserver.create(new inetsocketaddress(8080), 0); //创建一个httpcontext,将路径为/myserver请求映射到myhttphandler处理器 httpserver.createcontext("/myserver", new myhttphandler()); //设置服务器的线程池对象 httpserver.setexecutor(executors.newfixedthreadpool(10)); //启动服务器 httpserver.start(); } }
httpserver:httpserver主要是通过带参的create方法来创建,第一个参数inetsocketaddress表示绑定的ip地址和端口号。第二个参数为int类型,表示允许排队的最大tcp连接数,如果该值小于或等于零,则使用系统默认值。
createcontext:可以调用多次,表示将指定的url路径绑定到指定的httphandler处理器对象上,服务器接收到的所有路径请求都将通过调用给定的处理程序对象来处理。
setexecutor:设置服务器的线程池对象,不设置或者设为null则表示使用start方法创建的线程。
httphandler实现
package bg.httpserver; import com.sun.net.httpserver.headers; import com.sun.net.httpserver.httpexchange; import com.sun.net.httpserver.httphandler; import java.io.bufferedreader; import java.io.inputstreamreader; import java.io.outputstream; import java.util.list; import java.util.map; import java.util.stream.collectors; /** * 处理/myserver路径请求的处理器类 */ public class myhttphandler implements httphandler { @override public void handle(httpexchange httpexchange) { try { stringbuilder responsetext = new stringbuilder(); responsetext.append("请求方法:").append(httpexchange.getrequestmethod()).append("<br/>"); responsetext.append("请求参数:").append(getrequestparam(httpexchange)).append("<br/>"); responsetext.append("请求头:<br/>").append(getrequestheader(httpexchange)); handleresponse(httpexchange, responsetext.tostring()); } catch (exception ex) { ex.printstacktrace(); } } /** * 获取请求头 * @param httpexchange * @return */ private string getrequestheader(httpexchange httpexchange) { headers headers = httpexchange.getrequestheaders(); return headers.entryset().stream() .map((map.entry<string, list<string>> entry) -> entry.getkey() + ":" + entry.getvalue().tostring()) .collect(collectors.joining("<br/>")); } /** * 获取请求参数 * @param httpexchange * @return * @throws exception */ private string getrequestparam(httpexchange httpexchange) throws exception { string paramstr = ""; if (httpexchange.getrequestmethod().equals("get")) { //get请求读querystring paramstr = httpexchange.getrequesturi().getquery(); } else { //非get请求读请求体 bufferedreader bufferedreader = new bufferedreader(new inputstreamreader(httpexchange.getrequestbody(), "utf-8")); stringbuilder requestbodycontent = new stringbuilder(); string line = null; while ((line = bufferedreader.readline()) != null) { requestbodycontent.append(line); } paramstr = requestbodycontent.tostring(); } return paramstr; } /** * 处理响应 * @param httpexchange * @param responsetext * @throws exception */ private void handleresponse(httpexchange httpexchange, string responsetext) throws exception { //生成html stringbuilder responsecontent = new stringbuilder(); responsecontent.append("<html>") .append("<body>") .append(responsetext) .append("</body>") .append("</html>"); string responsecontentstr = responsecontent.tostring(); byte[] responsecontentbyte = responsecontentstr.getbytes("utf-8"); //设置响应头,必须在sendresponseheaders方法之前设置! httpexchange.getresponseheaders().add("content-type:", "text/html;charset=utf-8"); //设置响应码和响应体长度,必须在getresponsebody方法之前调用! httpexchange.sendresponseheaders(200, responsecontentbyte.length); outputstream out = httpexchange.getresponsebody(); out.write(responsecontentbyte); out.flush(); out.close(); } }
运行httpserverstarter,在浏览器中访问如下:
以上就是java 如何实现一个http服务器的详细内容,更多关于java 实现http服务器的资料请关注其它相关文章!
上一篇: 浅析MySQL的WriteSet并行复制
下一篇: MySQL 如何连接对应的客户端进程
推荐阅读
-
java利用jsch实现sftp上传一个目录下的所有文件到Linux服务器
-
PHP代码实现攻击HTTP服务器
-
PHP代码实现攻击HTTP服务器
-
同一个服务器上如何获取不同项目中的数据?
-
ThinkPHP6源码:从Http类的实例化看依赖注入是如何实现的
-
在Python中该如何实现Java的重写与重载
-
node.js - windows的服务器,一个文件夹最多能放多少个文件而不会影响php/nodejs/java等读取文件的速度?
-
如何将一个数据均匀的分布到不同的缓存服务器上?
-
不同服务器上的mysql数据库如何实现同步异步备份
-
PHP、Java、C#实现URI参数签名算法,确保应用与REST服务器之间的