关于java轻量级httpserver的信息

今天给各位分享java轻量级httpserver的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、关于Java JDK1.6自带的HttpServer线程接收请求的问题,哪位对这块比较熟悉,求解决2、java 如何实现 http协议传输3、如何开发自己的httpserver-nanohttpd源码解读4、java 如何搭建http服务器5、用java编写的httpserver如何处理客户端发来的表单数据6、请教如何在嵌入式上实现 http server

关于Java JDK1.6自带的HttpServer线程接收请求的问题,哪位对这块比较熟悉,求解决

输出完了要关闭连接啊。用exc.close(); 执行关闭连接。

HttpServer server = HttpServer.create(new InetSocketAddress(44444),10);

的10 表示队列能接受10个请求。如果队列的请求超过10个,就不再加入队列,而是直接断开连接。

丢失部分请求 就是因为请求超过了队列的10个 所以服务器直接丢弃了啊。

java 如何实现 http协议传输

Java 6 提供了一个轻量级的纯 Java Http 服务器的实现。下面是一个简单的例子:

public static void main(String[] args) throws Exception{

 HttpServerProvider httpServerProvider = HttpServerProvider.provider();

 InetSocketAddress addr = new InetSocketAddress(7778);

 HttpServer httpServer = httpServerProvider.createHttpServer(addr, 1);

 httpServer.createContext(“/myapp/”, new MyHttpHandler());

 httpServer.setExecutor(null);

 httpServer.start();

 System.out.println(“started”);

}

static class MyHttpHandler implements HttpHandler{

 public void handle(HttpExchange httpExchange) throws IOException {

String response = “Hello world!”;

httpExchange.sendResponseHeaders(200, response.length());

OutputStream out = httpExchange.getResponseBody();

out.write(response.getBytes());

out.close();

 }

}

然后,在浏览器中访问

如何开发自己的httpserver-nanohttpd源码解读

现在作为一个开发人员,http server相关的内容已经是无论如何都要了解的知识了。用curl发一个请求,配置一下apache,部署一个web server对我们来说都不是很难,但要想搞清楚这些背后都发生了什么技术细节还真不是很简单的。所以新的系列将是分享我学习Http Server的过程。

NanoHttpd是Github上的一个开源项目,号称只用一个java文件就能创建一个http server,我将通过分析NanoHttpd的源码解析如何开发自己的HttpServer。Github 地址:

在开始前首先简单说明HttpServer的基本要素:

1.能接受HttpRequest并返回HttpResponse

2.满足一个Server的基本特征,能够长时间运行

关于Http协议一般HttpServer都会声明支持Http协议的哪些特性,nanohttpd作为一个轻量级的httpserver只实现了最简单、最常用的功能,不过我们依然可以从中学习很多。

首先看下NanoHttpd类的start函数

[java] view plaincopy

public void start() throws IOException {

myServerSocket = new ServerSocket();

myServerSocket.bind((hostname != null) ? new InetSocketAddress(hostname, myPort) : new InetSocketAddress(myPort));

myThread = new Thread(new Runnable() {

@Override

public void run() {

do {

try {

final Socket finalAccept = myServerSocket.accept();

registerConnection(finalAccept);

finalAccept.setSoTimeout(SOCKET_READ_TIMEOUT);

final InputStream inputStream = finalAccept.getInputStream();

asyncRunner.exec(new Runnable() {

@Override

public void run() {

OutputStream outputStream = null;

try {

outputStream = finalAccept.getOutputStream();

TempFileManager tempFileManager = tempFileManagerFactory.create();

HTTPSession session = new HTTPSession(tempFileManager, inputStream, outputStream, finalAccept.getInetAddress());

while (!finalAccept.isClosed()) {

session.execute();

}

} catch (Exception e) {

// When the socket is closed by the client, we throw our own SocketException

// to break the “keep alive” loop above.

if (!(e instanceof SocketException “NanoHttpd Shutdown”.equals(e.getMessage()))) {

e.printStackTrace();

}

} finally {

safeClose(outputStream);

safeClose(inputStream);

safeClose(finalAccept);

unRegisterConnection(finalAccept);

}

}

});

} catch (IOException e) {

}

} while (!myServerSocket.isClosed());

}

});

myThread.setDaemon(true);

myThread.setName(“NanoHttpd Main Listener”);

myThread.start();

}

1.创建ServerSocket,bind制定端口

2.创建主线程,主线程负责和client建立连接

3.建立连接后会生成一个runnable对象放入asyncRunner中,asyncRunner.exec会创建一个线程来处理新生成的连接。

4.新线程首先创建了一个HttpSession,然后while(true)的执行httpSession.exec。

这里介绍下HttpSession的概念,HttpSession是java里Session概念的实现,简单来说一个Session就是一次httpClient-httpServer的连接,当连接close后session就结束了,如果没结束则session会一直存在。这点从这里的代码也能看到:如果socket不close或者exec没有抛出异常(异常有可能是client段断开连接)session会一直执行exec方法。

一个HttpSession中存储了一次网络连接中server应该保存的信息,比如:URI,METHOD,PARAMS,HEADERS,COOKIES等。

5.这里accept一个client的socket就创建一个独立线程的server模型是ThreadServer模型,特点是一个connection就会创建一个thread,是比较简单、常见的socket server实现。缺点是在同时处理大量连接时线程切换需要消耗大量的资源,如果有兴趣可以了解更加高效的NIO实现方式。

当获得client的socket后自然要开始处理client发送的httprequest。

Http Request Header的parse:

[plain] view plaincopy

// Read the first 8192 bytes.

// The full header should fit in here.

// Apache’s default header limit is 8KB.

// Do NOT assume that a single read will get the entire header at once!

byte[] buf = new byte[BUFSIZE];

splitbyte = 0;

rlen = 0;

{

int read = -1;

try {

read = inputStream.read(buf, 0, BUFSIZE);

} catch (Exception e) {

safeClose(inputStream);

safeClose(outputStream);

throw new SocketException(“NanoHttpd Shutdown”);

}

if (read == -1) {

// socket was been closed

safeClose(inputStream);

safeClose(outputStream);

throw new SocketException(“NanoHttpd Shutdown”);

}

while (read 0) {

rlen += read;

splitbyte = findHeaderEnd(buf, rlen);

if (splitbyte 0)

break;

read = inputStream.read(buf, rlen, BUFSIZE – rlen);

}

}

1.读取socket数据流的前8192个字节,因为http协议中头部最长为8192

2.通过findHeaderEnd函数找到header数据的截止位置,并把位置保存到splitbyte内。

[java] view plaincopy

if (splitbyte rlen) {

inputStream.unread(buf, splitbyte, rlen – splitbyte);

}

parms = new HashMapString, String();

if(null == headers) {

headers = new HashMapString, String();

}

1.http协议规定header和body之间使用两个回车换行分割

1.Http协议第一行是Method URI HTTP_VERSION

2.后面每行都是KEY:VALUE格式的header

3.uri需要经过URIDecode处理后才能使用

4.uri中如果包含?则表示有param,httprequest的param一般表现为:/index.jsp?username=xiaomingid=2

下面是处理cookie,不过这里cookie的实现较为简单,所以跳过。之后是serve方法,serve方法提供了用户自己实现httpserver具体逻辑的很好接口。在NanoHttpd中的serve方法实现了一个默认的简单处理功能。

[java] view plaincopy

发送response的步骤如下:

1.设置mimeType和Time等内容。

2.创建一个PrintWriter,按照HTTP协议依次开始写入内容

3.第一行是HTTP的返回码

4.然后是content-Type

5.然后是Date时间

6.之后是其他的HTTP Header

7.设置Keep-Alive的Header,Keep-Alive是Http1.1的新特性,作用是让客户端和服务器端之间保持一个长链接。

8.如果客户端指定了ChunkedEncoding则分块发送response,Chunked Encoding是Http1.1的又一新特性。一般在response的body比较大的时候使用,server端会首先发送response的HEADER,然后分块发送response的body,每个分块都由chunk length\r\n和chunk data\r\n组成,最后由一个0\r\n结束。

9.如果没指定ChunkedEncoding则需要指定Content-Length来让客户端指定response的body的size,然后再一直写body直到写完为止。

关于java轻量级httpserver的信息

java 如何搭建http服务器

看你具体是想做什么,现在现成的开源的java的http服务器有很多,像tomcat之类的都有http服务器功能,如果你只是单纯的需要用的话,直接用tomcat就好了

但是如果你是做要自己用java实现一个http服务器的话就要稍微麻烦一点

http服务器,本质上还是基于tcpip协议的服务器,首先用java的ServerSocket监听一个端口(也可以使用开源的server组件,如quickserver之类的),然后对客户端发上来的数据进行处理,这里就需要了解一下http协议了,因为上来的数据,都是按照http协议来组织的,你需要将请求数据解析后,将响应数据组织成http的响应,发回给客户端。这样一个简单的http服务器就实现了。

但是这个请求和响应都有很多种类,一个完整的http服务器应该要都能够支持,所以这里面的工作量还是有一点的。

另外,上面说的http服务器只是一个静态的服务器,如果你想让你写的服务具有动态功能,那你的服务器还得提供javaee的容器功能,这样做下去,没准你也能写一个tomcat出来了……

用java编写的httpserver如何处理客户端发来的表单数据

获得客户端发送的变量用request.getAttribute(“变量名”)就可以获得,想交给另一个页面处理就转发到(dispatch)另一个页面

请教如何在嵌入式上实现 http server

一、使用SUN公司在JDK6中提供的新包com.sun.net.httpserver

JDK6提供了一个简单的Http

Server API,据此我们可以构建自己的嵌入式Http

Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server

API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法.

实现Http

Server

实现Http

Server比较简单,我就不我做解释,只要看下面的代码就能明白。

实现Https Server

HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,SSL

使用证书来进行验证。对于需要使用 SSL 来保证通信安全的客户端和服务器,都必须创建证书。JSSE 使用的证书要用与 J2SE 一起发布的 Java

keytool 来创建。用下列命令来为 HTTP 服务器创建一个 RSA 证书。

prompt keytool -genkey

-keystore serverkeys -keyalg rsa -alias qusay

这个命令会产生一个由别名 qusay

引用的证书,并将其保存在一个名为 serverkeys

的文件中。产生证书的时候,这个工具会提示我们输入一些信息。

下面代码演示了怎样创建自己的Http Server 和Https

Server:

Java代码

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;

import com.sun.net.httpserver.HttpHandler;

import com.sun.net.httpserver.HttpServer;

public class MyHTTPServer {

public static void main(String[] args)

{

try {

//实现HTTP SERVER

HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);// 设置HttpServer的端口为80

hs.createContext(“/hujun”, new MyHandler());// 用MyHandler类内处理到/的请求

hs.setExecutor(null); // creates a default executor

hs.start();

//实现HTTPS SERVER

HttpsServer hss = HttpsServer.create(new InetSocketAddress(443),0);  //设置HTTPS端口这443

KeyStore ks = KeyStore.getInstance(“JKS”); //建立证书库

ks.load(new FileInputStream(“证书名” ), “密码”);  //载入证书

KeyManagerFactory kmf = KeyManagerFactory.getInstance(“SunX509”);  //建立一个密钥管理工厂

kmf.init(ks, “密码”);  //初始工厂

SSLContext sslContext = SSLContext.getInstance(“SSLv3”);  //建立证书实体

sslContext.init(kmf.getKeyManagers(), null, null); //初始化证书

HttpsConfigurator conf = new HttpsConfigurator(sslContext);  //在https配置

hss.setHttpsConfigurator(conf); //在https server载入配置

hss.setExecutor(null); // creates a default executor

hss.createContext(“/”, new MyHandler());// 用MyHandler类内处理到/的请求

hss.start();

} catch (Exception e){

e.printStackTrace();

}

}

}

class MyHandler implements HttpHandler {

public void handle(HttpExchange t) throws IOException {

InputStream is = t.getRequestBody();

String response = “font color=’#ff0000’come on baby/font”;

t.sendResponseHeaders(200, response.length());

OutputStream os = t.getResponseBody();

os.write(response.getBytes());

os.close();

}

}

二、使用Jetty

Jetty

是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。

需要最少的包:

commons-logging.jar

javax.servlet.jar

org.mortbay.jetty.jar

org.mortbay.jmx.jar

下面直接看代码,以嵌入模式启动Jetty,目前貌似不支持HTTPS

Java代码

import org.mortbay.http.HttpContext;

import org.mortbay.http.HttpServer;

import org.mortbay.http.SocketListener;

import org.mortbay.http.handler.ResourceHandler;

public class JettySample {

public static void main(String[] args) throws Exception

{

//创建Jetty HttpServer对象

HttpServer server = new HttpServer();

//在端口8080上给HttpServer对象绑上一个listener,使之能够接收HTTP请求

SocketListener listener = new SocketListener();

listener.setPort(8080);

server.addListener(listener);

//创建一个HttpContext,处理HTTP请求。

HttpContext context = new HttpContext();

//用setContextPath把Context映射到(/web)URL上。

context.setContextPath(“/web”);

//setResourceBase方法设置文档目录以提供资源

context.setResourceBase(“C:\\j2sdk1.4.1_05”);

//添加资源处理器到HttpContext,使之能够提供文件系统中的文件

context.addHandler(new ResourceHandler());

server.addContext(context);

//启动服务器

server.start();

}

}

Jetty的运行速度较快,而且是轻量级的,可以在Java中可以从test

case中控制其运行。从而可以使自动化测试不再依赖外部环境,顺利实现自动化测试。

三、使用tomcat

embedded

关于java轻量级httpserver和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月2日 18:44:42
下一篇 2024年4月2日 18:58:08

相关推荐

  • 深入java虚拟机pdf,深入java虚拟机 中村成洋 pdf

    在linux环境下,java怎么实现从word格式转换为pdf格式 //设置当前使用的打印机,我的Adobe Distiller打印机名字为 Adobe PDF wordCom.setProperty( ActivePrinter , new Variant( Adobe PDF ));//设置printout的参数,将word文档打印为postscript…

    2024年5月23日
    4400
  • java截取指定长度字符串,java截取指定字符串之后的

    java中如何截取字符串中的指定一部分 第一个参数是开始截取的字符位置。(从0开始)第二个参数是结束字符的位置+1。(从0开始)indexof函数的作用是查找该字符串中的某个字的位置,并且返回。 int end);截取s中从begin开始至end结束时的字符串,并将其赋值给s;split讲解:java.lang.string.split split 方法 将…

    2024年5月23日
    4200
  • java绑定一个端口,java使用端口

    java如何多个service共用一个端口 你如果有多个项目的话,你可以把多个项目放到一个tomcat里面,这样端口相同使用项目名称来进行区分项目。你如果非要使用同一个,你也可以配置不同的域名导向不同的项目。就是访问的域名不同转接到的项目不同。 如果需要同时启动多个程序,要么修改tomcat的配置文件中的监听端口。要么修改jar包程序的监听端口。不能在一台服…

    2024年5月23日
    3400
  • java多线程并发编程基础,Java多线程并发执行返回

    电脑培训分享Java并发编程:核心理论 电脑培训发现本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。 人们开始意识到了继承的众多缺点,开始努力用聚合代替继承。软件工程解决扩展性的重要原则就是抽象描述,直接使用的工具就是接口。接…

    2024年5月23日
    4600
  • 自学java找工作,自学java找工作需要包装简历吗

    自学java学多久可以找到工作 1、自学Java至少需要一年以上的时间才能达到找工作的水平。报班培训四到六个月的时间就可以找到一份不错的工作。 2、自学Java至少需要一年以上的时间才能达到找工作的水平。 3、如果要想找到一份Java相关的工作,需要至少学习5-6个月时间才能就业。Java开发需要掌握一些基础的编程语言知识,比如掌握面向对象的编程思想、基本的…

    2024年5月23日
    4300
  • java左移右移,java 左移

    java位移问题 1、思路:直接用Integer类的bit运算操作。 2、移位操作:左移:向左移位,符号后面的数字是移了多少位,移的位用0补齐,例如2进制数01111111左移一位后变为11111110,移位是字节操作。 3、Java 位运算 Java 位运算[转]一,Java 位运算表示方法: 在Java语言中,二进制数使用补码表示,最高位为符号位,正数的…

    2024年5月23日
    4200
  • java技术规范,java规范性要求

    现在主流的JAVA技术是什么? java最流行开发技术程序员必看 1 、Git Git一直是世界上最受欢迎的Java工具之一,也是Java开发人员最杰出的工具之一。Git是一个开源工具,是-种出色的分布式版本控制解决方案。 (1).Java基础语法、数组、类与对象、继承与多态、异常、范型、集合、流与文件、反射、枚举、自动装箱和注解。(2).Java面向对象编…

    2024年5月23日
    4000
  • javasocket编程,Java socket编程中,禁用nagle算法的参数

    Java进行并发多连接socket编程 1、Java可利用ServerSocket类对外部客户端提供多个socket接口。基本的做法是先创建一个ServerSocket实例,并绑定一个指定的端口,然后在这个实例上调用accept()方法等待客户端的连接请求。 2、Socket socket=server.accept(0;Thread handleThrea…

    2024年5月23日
    4600
  • java死亡,java死代码是什么意思

    我的世界传送回死亡点指令是什么? 1、下面就让我们一起来了解一下吧:我的世界回到死的地方的指令是输入/back,就可以回到死亡地点了,当然也可以看信标,因为死亡后会有一道光集中在死亡点,只要循着光就可以找到目的地了。 2、在服务器中的指令 首先打开指令台,在指令行输入“/back”就可以回到自己的死亡地点了。在单人游戏中的指令 在单人游戏中,您无法直接返回到…

    2024年5月23日
    4800
  • myeclipse能部署java工程么,myeclipse支持jdk18

    myeclipse如何建java文件 1、点击【File】—【New】–【Class】在如下界面,输入Class的名字,如Test,点击【Finish】。Test.java文件创建成功。 2、点击【File】—【New】–【Class】 在如下界面,输入Class的名字,如Test,点击【Finish】。 Te…

    2024年5月23日
    3900

发表回复

登录后才能评论



关注微信