1. 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();
}
}
然后,在浏览器中访问 http://localhost:7778/myapp/
2. JAVA代码发送HTTP请求问题(我想实现和服务器进行一次连接时发送两次请求)
我觉得你这个问题的解决应该是你的程序做一次这个网站的登陆,而且这个登陆的动作应该是需要发生在你这段代码以前,因为你这段代码的动作其实只是访问了一下那个网站,但是没有任何的用户或者是其他的信息。
一般来说你登陆以后,你会获得一个token,用那个token就可以让网站认为你已经登陆,然后改密码什么就好办了。建议你先抓一下IE的包看看是人家的通信是怎么样的,然后用java做就好了。或者是那个网站有开发者文档就最好了。
3. 关于用Java在Tomcat上部署http服务的问题。
你用SOCKET编程需要编写两个端,一个是客户端,一个是服务端。
既然部署上TOMCAT,那么服务端的编程就变成TOMCAT上服务端的SERVLET的编程。写一个SERVLET接收请求、返回响应。你想打印什么都可以。
这个时候客户端就简单成一个表单页面(如登录页面那样),可以使用html,jsp编写。也可以直接使用URL在浏览器中进行请求。也可以仍然SOCKET发送、接收请求。
你需要简单的学习下SERVLET/JSP的WEB编程。前台的页面、后台的SERVLET是对socket编程的封装。
4. 如何用Java实现Web服务器
一 HTTP协议的作用原理
WWW是以Internet作为传输媒介的一个应用系统 WWW网上最基本的传输单位是Web网页 WWW的工作基于客户机/服务器计算模型 由Web 浏览器(客户机)和Web服务器(服务器)构成 两者之间采用超文本传送协议(HTTP)进行通信 HTTP协议是基于TCP/IP协议之上的协议 是Web浏览器和Web服务器之间的应用层协议 是通用的 无状态的 面向对象的协议 HTTP协议的作用原理包括四个步骤
( ) 连接 Web浏览器与Web服务器建立连接 打开一个称为socket(套接字)的虚拟文件 此文件的建立标志着连接建立成功
( ) 请求 Web浏览器通过socket向Web服务器提交请求 HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递) GET命令的格式为
GET 路径/文件名 HTTP/
文件名指出所访问的文件 HTTP/ 指出Web浏览器使用的HTTP版本
( ) 应答 Web浏览器提交请求后 通过HTTP协议传送给Web服务器 Web服务器接到后 进行事务处理 处理结果又通过HTTP传回给Web浏览器 从而在Web浏览器上显示出所请求的页面
例 假设客户机与 /mydir/l建立了连接 就会发送GET命令 GET /mydir/l HTTP/ 主机名为的Web服务器从它的文档空间中搜索子目录mydir的文件l 如果找到该文件 Web服务器把该文件内容传送给相应的Web浏览器
为了告知 Web浏览器传送内容的类型 Web服务器首先传送一些HTTP头信息 然后传送具体内容(即HTTP体信息) HTTP头信息和HTTP体信息之间用一个空行分开
常用的HTTP头信息有
① HTTP OK
这是Web服务器应答的第一行 列出服务器正在运行的HTTP版本号和应答代码 代码 OK 表示请求完成
② MIME_Version
它指示MIME类型的版本
③ content_type 类型
这个头信息非常重要 它指示HTTP体信息的MIME类型 如 content_type text/指示传送的数据是HTML文档
④ content_length 长度值
它指示HTTP体信息的长度(字节)
( ) 关闭连接 当应答结束后 Web浏览器与Web服务器必须断开 以保证其它Web浏览器能够与Web服务器建立连接
二绝败胡 Java实现Web服务器功能的程序设计
根据上述HTTP协议的作用原理 实现GET请求的Web服务器程序的方法如下
( ) 创并拦建ServerSocket类对象 监听端口 这是为了区别于HTTP的标准TCP/IP端口 而取的
( ) 等待 接受客户机连接到端口 得到与客户机连接的socket
( )枯大 创建与socket字相关联的输入流instream和输出流outstream
( ) 从与socket关联的输入流instream中读取一行客户机提交的请求信息 请求信息的格式为 GET 路径/文件名 HTTP/
( ) 从请求信息中获取请求类型 如果请求类型是GET 则从请求信息中获取所访问的HTML文件名 没有HTML文件名时 则以l作为文件名
( ) 如果HTML文件存在 则打开HTML文件 把HTTP头信息和HTML文件内容通过socket传回给Web浏览器 然后关闭文件 否则发送错误信息给Web浏览器
( ) 关闭与相应Web浏览器连接的socket字
下面的程序是根据上述方法编写的 可实现多线程的Web服务器 以保证多个客户机能同时与该Web服务器连接
程序 WebServer java文件
//WebServer java 用JAVA编写Web服务器
import java io *
import *
public class WebServer {
public static void main(String args[]) {
int i= PORT=
ServerSocket server=null
Socket client=null
try {
server=new ServerSocket(PORT)
System out println( Web Server is listening on port +server getLocalPort())
for ( ) {client=server accept() //接受客户机的连接请求
new ConnectionThread(client i) start()
i++
}
} catch (Exception e) {System out println(e) }
}
}
/* ConnnectionThread类完成与一个Web浏览器的通信 */
class ConnectionThread extends Thread {
Socket client //连接Web浏览器的socket字
int counter //计数器
public ConnectionThread(Socket cl int c) {
client=cl
counter=c
}
public void run() //线程体
{try {
String destIP=client getInetAddress() toString() //客户机IP地址
int destport=client getPort() //客户机端口号
System out println( Connection +counter+ connected to +destIP+ on port +destport+ )
PrintStream outstream=new PrintStream(client getOutputStream())
DataInputStream instream=new DataInputStream(client getInputStream())
String inline=instream readLine() //读取Web浏览器提交的请求信息
System out println( Received +inline)
if (getrequest(inline)) { //如果是GET请求
String filename=getfilename(inline)
File file=new File(filename)
if (file exists()) { //若文件存在 则将文件送给Web浏览器
System out println(filename+ requested )
outstream println( HTTP/ OK )
outstream println( MIME_version )
outstream println( Content_Type text/ )
int len=(int)file length()
outstream println( Content_Length +len)
outstream println( )
sendfile(outstream file) //发送文件
outstream flush()
} else { //文件不存在时
String notfound=
Error file not found
outstream println( HTTP/ no found )
outstream println( Content_Type text/ )
outstream println( Content_Length +notfound length()+ )
outstream println( )
outstream println(notfound)
outstream flush()
}
}
long m =
while (m < ) {m ++ } //延时
client close()
} catch (IOException e) {
System out println( Exception +e)
}
}
/* 获取请求类型是否为 GET */
boolean getrequest(String s) {
if (s length()> )
{if (s substring( ) equalsIgnoreCase( GET )) return true
}
return false
}
/* 获取要访问的文件名 */
String getfilename(String s) {
String f=s substring(s indexOf(′ ′)+ )
f=f substring( f indexOf(′ ′))
try {
if (f charAt( )==′/′)
f=f substring( )
} catch ( e) {
System out println( Exception +e)
}
if (f equals( )) f= l
return f
}
/*把指定文件发送给Web浏览器 */
void sendfile(PrintStream outs File file) {
try {
DataInputStream in=new DataInputStream(new FileInputStream(file))
int len=(int)file length()
byte buf[]=new byte[len]
in readFully(buf)
outs write(buf len)
outs flush()
in close()
} catch (Exception e) {
System out println( Error retrieving file )
System exit( )
}
}
}
程序中的ConnectionThread线程子类用来分析一个Web浏览器提交的请求 并将应答信息传回给Web浏览器 其中 getrequest()方法用来检测客户的请求是否为 GET getfilename(s)方法是从客户请求信息s中获取要访问的HTML文件名 sendfile()方法把指定文件内容通过socket传回给Web浏览器
对上述程序的getrequest()方法和相关部分作修改 也能对POST请求进行处理
三 运行实例
为了测试上述程序的正确性 将编译后的WebServer class ConnectionThread class和下面的l文件置于网络的某台主机的同一目录中(如 主机NT SRV的C JWEB目录)
程序 l文件
年 月 日
首先在该主机上用java命令运行WebServer class
C jweb>java webserver
然后在客户机运行浏览器软件 在URL处输入WebServer程序所属的URL地址(如 ) 就在浏览器窗口显示出指定的HTML文档
注意 不能缺省端口号 如缺省 则运行该主机的正常WEB服务器
lishixin/Article/program/Java/hx/201311/26626
5. Java网络编程从入门到精通(23):HTTP消息头字段
专题推荐 网络编程 基础到进阶教程
一 通用头字段
Connection
这个字段只在HTTP 协议中存在 它决定了客户端和服务器进行了一次会话后 服务器是否立即关闭网络连接 在客户端最直接的表现是使用read方法(readLine方法也是一样)读完客户端请求的Web资源后 是否立即返回 (readLine返回null) Connection有两个值 Close和Keep Alive 当使用Connection Close时 和HTTP 协议是一样的 当read方法读完数据时立即返回 而使用Connection Keep Alive时 read方法在读完数据后还要烂局被阻塞一段时间 直接读取数据超时时间过后 还继续往下执行 在上一篇文章中讨论的readHttpResponse(……)方法实现的第 行可以验证Connection的作用 下面让我们来使用HTTP模拟器来做一个实验
( )在HTTP模拟器中输入如下的域名
( )HTTP模拟器中输入如下的HTTP请求信息
GET/HTTP/ 孙唤Host:
( )按两下回车(输入一个空行)后 发送请求消息 并得到如图 如示的HTTP响应消息头
图( )输入y或Y后(在显示响应头后 要立刻输入Y或y) 显示响应消息的内容 在显示完内容后 大约过了 秒钟才进入 host port> 提示符(因为在sendHttpRequest()的实现代码中的 行设置了读取数据超时)
( )在 host port> 提示符下直接按回车 输入最近一次使用的域名和 端口 再次输入如下的HTTP请求
GET/HTTP/ Host: Connection:close
输入完以上的HTTP请求后 重新执行第 步操作 最后在显示HTTP响应消息内容后 直接直入了 host port> 提示符 除了这种方法 将请求的第一行改为GET / HTTP/ 这样也可以无需等待直接结束
通过设置Connection 可以在下载Web资源(如多线程下载工具 Web浏览器等)后 立即断开网络连接 这样可以有效地降低客户机的资源消耗
Date
这个Date头字段描述了请求消息和响应消息被创建的时间 这个字段值是一个HTTP date类型 它的格式必须是GMT(格林尼治)时间 GMT时间是就是北京时间减 小时 下面是Date字段的一个例子
Date:Tue Nov : : GMT
Content Length
指定消息实体的则历凯字节数 在请求消息中POST方法必须使用Content Length来指定请求消息的实体内容的字节数 在响应消息中这个字段值指定了当前HTTP响应所返回的Web资源的字节数
二 HTTP请求消息头字段
Host
Host字段用于指定客户端所访问的资源所在的主机名和端口号 如果端口号等于连接服务器时所使用的端口号 则端口号可以省略 下面是一个使用Host字段的一个例子
Host:
这个字段是必须的 如果HTTP请求不包含这个字段 服务器将返回 (Bad Request)响应状态
Accept
Accept字段头确定客户端可以接收的媒体类型 一般的格式是 */* 或 类型/ 子类型 这个子段头可以传递多个媒体类型 中间用 隔开 如下面是一个Accept的例子
Accept: image/gif image/jpg
如果请求头使用上述的Accept字段值 则服务器端在动态生成网页的IMG头时将首先包含gif格式的图像 如果gif图象不存在 则包含jpg格式的图象
User Agent
这个字段头用于指定客户端是用什么访问的服务器 如果是IE 浏览器 并且本机安装了 net 则User Agent会有如下的值
User Agent:Mozilla/ (patible;MSIE ;WindowsNT ;SV ;Maxthon; NETCLR ; NETCLR ;InfoPath ;InfoPath )
服务器可以通过这个字段检查客户机的浏览器版本 并根据不同的版本来确定向客户端发送的数据
Range
Range字段头通过服务器只传输一部分Web资源 这个字段头可以用来实现断点续传功能 有很多下载工具就是通过这个字段头进行断点续传的 Range字段可以通过三种格式设置要传输的字节范围
( )Range bytes=
传输范围从 到 字节
( )Range bytes=
传输Web资源中第 个字节以后的所有内容
( )Range bytes=
传输最后 个字节
三 HTTP响应消息头字段
Accept Ranges
这个字段说明Web服务器是否支持Range(是否支持断点续传功能) 如果支持 则返回Accept Ranges bytes 如果不支持 则返回Accept Ranges none
Content Range
指定了返回的Web资源的字节范围 这个字段值的格式是
开始字节位置—结束字节位置/Web资源的总字节数
下面是一个使用Content Range的例子
Content Range /
测试
在HTTP模拟器中连接服务器 并输入如下的HTTP请求消息
GET /nokiaguy/HttpSimulator rar HTTP/ Host: Range:bytes=
返回的响应消息头如图 所示
图从上图可以看出 服务器支持断点继传功能 而且还可以验证Content Length的值是当前会话传过来的字节数 并不是Web资源的总的字节数 而Content Range字段值中 / 后面的数才是Web资源总的字节数
Location
lishixin/Article/program/Java/hx/201311/27047
6. 怎样用JAVA实现模拟HTTP请求,得到服务器的响应时间等参数
java.net.*;
publicclassHttpDemo{
publicstaticvoidmain(String[]args)throwsException{
URLurl=newURL('地址');
HttpURLConnectionhttp=(HttpURLConnection)url.openConnection();
//获取网页的源码
BufferedReader游兆br=newBufferedReader(newInputStreamReader(http.getInputStream()));
String枝磨衡line="";
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
//获取参数:
Stringvalue=getRequestProperty(Stringkey);
猛做}
}
7. 使用Java开发一个HTTP服务器,能够处理POST,GET,PUT,DELETE请求。
使用Java开发一个HTTP服务器,能够处理POST,GET,PUT,DELETE请求。
1. 监听端口可以配置;
2. 可以配置的一个工作目录;
3. GET请求可以获得相对于该工作目录的静态文件的内容,内容格式限定为html,css,js,json,xml,txt,jpg,gif,png,ico;
a) 例如 GET /f/test1.html返回工作目录下f文件夹下test1.html内容;
b) 在GET请求的的应答中尽可能多的在HTTP头中返回些能获得的到的标准的头信息;
4. POST请求可以在工作目录中创建请求路径对应的文件,文件内容为POST请求的内容;
a) 例如 POST /f/test2.html,在工作目录下f文件夹下创建test2.html文件,并将POST内容作为test2.html的内容。
5. PUT请求可以替换对应路径的文件,修改的内容为PUT请求的内容。注意与POST不同。
a) 例如 PUT /f/test2.html,在工作目录下f文件夹替换test2.html文件的内容,并将PUT内容作为test2.html的内容。
6. DELET请求可以删除对应路径的文件。
a) 例如 PUT /f/test2.html,在工作目录下f文件夹删除test2.html文件。
7. POST,PUT,DELETE成功后返回200,出现找不到文件的情况返回404错误,出现读写文件错误返回500错误。
8. 特别的处理~路径下的GET请求,其包含2个参数,一个是类名,一个是方法名,这些方法都是些无参数并且以字符串为返回值的方法,GET请求应返回这些方法的返回值。
a) 例如 GET /~?class=com.test.Test&method=getTIme,则调用com.test.Test类中String getTIme()方法,将返回值作为GET请求的返回;
b) 若找不到类或方法返回404错误;
c) 若出错返回500错误;
9. 特别的处理$路径下的GET请求,能够为浏览器添加cookie,key为sid,值为UUID的随机字符串。
注意:不是在tomcat之类servlet容器上开发,而是要开发个类似servlet容器的东西。
8. java 如何搭建http服务器
看你具体是想做什么,现在现成的开源的java的http服务器有很多,像tomcat之类的都有http服务器功能,如果你只是单纯的需要用的话,直接用tomcat就好了
但是如果你是做要自己用java实现一个http服务器的话就要稍微麻烦一点
http服务器,本质上还是基于tcpip协议的服务器,首先用java的ServerSocket监听一个端口(也可以使用开源的server组件,如quickserver之类的),然后对客户端发上来的数据进行处理,这里就需要了解一下http协议了,因为上来的数据,都是按照http协议来组织的,你需要将请求数据解析后,将响应数据组织成http的响应,发回给客户端。这样一个简单的http服务器就实现了。
但是这个请求和响应都有很多种类,一个完整的http服务器应该要都能够支持,所以这里面的工作量还是有一点的。
另外,上面说的http服务器只是一个静态的服务器,如果你想让你写的服务具有动态功能,那你的服务器还得提供javaee的容器功能,这样做下去,没准你也能写一个tomcat出来了……