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出來了……