導航:首頁 > 編程語言 > javahttp伺服器編程

javahttp伺服器編程

發布時間:2023-06-15 05:03:17

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寫出的WEB伺服器主頁

年 月 日


首先在該主機上用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出來了……

閱讀全文

與javahttp伺服器編程相關的資料

熱點內容
cnc編程工程師自我評價 瀏覽:126
書本文件夾夾子怎麼安 瀏覽:801
如何更改編譯器的背景 瀏覽:84
linuxcp拷貝文件 瀏覽:608
我的世界如何屏蔽別人伺服器 瀏覽:907
單片機燒錄員 瀏覽:970
美國數據伺服器可以部署什麼業務 瀏覽:973
如何卸載伺服器中的ie 瀏覽:42
單片機必須學編程嗎 瀏覽:153
如何判斷是否與伺服器連接資料庫 瀏覽:740
吃甜食會緩解壓力嘛 瀏覽:317
pdf魔鬼 瀏覽:29
二維數組遞歸解決演算法問題 瀏覽:382
java反射例子 瀏覽:670
惠普筆記本自帶解壓軟體 瀏覽:840
抖音視頻後台壓縮 瀏覽:707
app里的視頻廣告從哪裡接的 瀏覽:556
天翼雲伺服器跟騰訊雲 瀏覽:618
cyk演算法實現 瀏覽:191
大潘號app在哪裡可以下載 瀏覽:109