導航:首頁 > 編程語言 > java搭建http伺服器

java搭建http伺服器

發布時間:2022-09-03 21:00:57

① 怎麼用java實現web伺服器的監控

如何用Java實現Web伺服器 一、HTTP協議的作用原理
WWW是以Internet作為傳輸媒介的一個應用系統,WWW網上最基本的傳輸單位是Web網頁。WWW的工作基於客戶機/伺服器計算模型,由Web 瀏覽器(客戶機)和Web伺服器(伺服器)構成,兩者之間採用超文本傳送協議(HTTP)進行通信。HTTP協議是基於TCP/IP協議之上的協議,是Web瀏覽器和Web伺服器之間的應用層協議,是通用的、無狀態的、面向對象的協議。HTTP協議的作用原理包括四個步驟:

(1) 連接:Web瀏覽器與Web伺服器建立連接,打開一個稱為socket(套接字)的虛擬文件,此文件的建立標志著連接建立成功。

(2) 請求:Web瀏覽器通過socket向Web伺服器提交請求。HTTP的請求一般是GET或POST命令(POST用於FORM參數的傳遞)。GET命令的格式為:

GET 路徑/文件名 HTTP/1.0

文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。

(3) 應答:Web瀏覽器提交請求後,通過HTTP協議傳送給Web伺服器。Web伺服器接到後,進行事務處理,處理結果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。詳細方法可向itjob老師了解

② 怎樣用java編寫httpserver要區別get和put嗎

這主要是看你打算同時支持 GET 和 PUT 還是只打算支持其中的一個。如果你不覆蓋父類的 doGet 或 doPut 可能客戶端訪問時得到的就是 "不支持的操作」。

GET 和 PUT 的有區別的,從字面上來講:

GET 是去伺服器拿。
PUT 是把東西送給伺服器。

略有區別,但主要的還是看數據怎麼表示,比如 GET 的參數都在 URL 後面,而 POST 則把它放在 BODY 中。當我們做文件上傳這種操作當然就只能用 POST 啦。普通的表單這種就可以用 GET 也可以用 POST。

③ 如何寫一個簡單的HTTP伺服器

本Guide利用Eclipse及Ant建立簡單Web Service演示Web Service基本發程:

1.系統條件:
Eclipse Java EE IDE for Web Developers
Java SE 6
Windows XP
2.基本環境搭建:
1)Java SE6 JDK安裝:載Java SE6 JDK雙擊安裝默認選項進行安裝即
2)Eclipse安裝與配置:
安裝直接解壓
配置處兩點Window>Preferences>Java>Installed JREs確保設置:

安裝路徑能略同
Window>Preferences>Java>Compiler 確保設置:

3.建立Server端工程相關包與類:
創建Java Project命名wsServerHelloWorld:

項目建立包:org.gnuhpc.wsServer

包邊建立類:SayHello

SayHello.java文件輸入代碼:
package org.gnuhpc.wsServer;
import javax.jws.WebService;
@WebService
public class SayHello {
private static final String SALUTATION = "Hello";
public String getGreeting(String name) {
return SALUTATION + " " + name;
}
}
其注意@WebService 稱作annotation或者metadataJava SE 5Web Services Metadata Specification引入Java SE 6於Web Services規范升級及JAX-WS(Java API for XML Web Services)2.0規范些升級使我Web Services創建調用變更加容易使用些新功能我僅僅使用簡單Annotations注釋Java類創建Web Services發者其類前用該annotations指定類告訴runtime engineWeb Service式操作使能該類annotations產布署Web ServiceWSDL映射annotationsJava源代碼與代表Web ServiceWSDL元素連接起

4.使用Ant產Server端代碼:
首先項目新建文件:build.xml使用OpenWith>AntEditor打輸入腳本代碼:

<arg line="-cp ./bin -keep -s ./src -d ./bin
org.gnuhpc.wsServer.SayHello"/>

default指定默認執行Targetwsgen,wsgen創建能夠使用WebService類所用於WebService發布源代碼文件經編譯二進制類文件WSDL符合規范該類WebService
Target名稱wsgen具體執行命令參數:
-cp 類路徑
-keep產java文件
-s 產源文件放哪
-d 產輸問價放哪

使用Ant Build選項運行:

功執行提示我刷新Project

我Project區域看結:

5.布Web Service
org.gnuhpc.wsServer建立類RunService:
package org.gnuhpc.wsServer;
import javax.xml.ws.Endpoint;
public class RunService {
/**
*@paramargs
*/
public static void main(String[] args) {
System.out.println("SayHello Web Service started.");
Endpoint.publish("" ,
new SayHello());
}
}
運行Run As>Java Application我結說明web serviceServer端已經啟

6.查看WSDL:
Window>Show View>Other>General>Internal Web Browser其輸入:?wsdl

看看底WSDL都記錄哪些信息看完停止該Server
7.監測Server
我創建完Server用Eclipse Web Services Explorer監測Server
Window>Open Perspective>Other >JavaEE

打Eclipse Web Services Explorer

點擊右角WSDL Page按鈕:

單擊WSDL MainURL輸入:?wsdl 按Go按鈕現視圖:

我觸發Web Service操作:點擊getGreetings添加參數比gnuhpc點擊Go按鈕:

8.創建Client端 工程相關包與類:
創建Java Project命名wsClientHelloWorld項目建立包:org.gnuhpc.wsClient

9.使用Ant產Client代碼框架:
編寫Web service使用工具利用WSDL進行調用客戶端樁;或者使用底層API手編寫Web service前者便者靈現我通前者做說明:
新建文件build.xml
New>File>build.xml

<arg line="-keep -s ./src -p org.gnuhpc.wsClient
-d ./bin ?wsdl"/>

注意:wsgen 支持 Java class 創建 Web serviceswsimport 支持 WSDL 創建 Web services別應於 JAX-RPC 式 Java2WSDL WSDL2Java要根據發布WSDL進行創建要先運行RunServer原
運行ServerRunService : Run As>Java Application>
運行該Ant腳本產Client代碼:Run As>Ant Build
運行功提示:

代碼:

步讀取WSDL並客戶端樁些樁我代碼所用Java類介面些樁給伺服器端功能提供客戶端介面例我伺服器提供Maths服務該服務帶叫做add我客戶端代碼調用樁樁實現該使用參數封裝Java調用變Webservice請求請求基於HTTP發送給伺服器且使用SOAP作RPC協議監聽伺服器接收該SOAP消息(十八九)其轉換伺服器處調用

④ 用JAVA實現模擬HTTP請求,得到伺服器響應時間等參數

之前看過一下。。用純java控制台實現http請求的。。 好像只是1.6 update * 的產品。

⑤ 使用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容器的東西。

⑥ 如何用JAVA實現一個代理伺服器

代理伺服器的應用非常廣泛。比如,在企業網內部,它可以用來控制員工在工作時瀏覽的Internet內容,阻止員工訪問某些類型的內容或某些指定的網站。代理伺服器實際上扮演著瀏覽器和Web伺服器之間的中間人的角色,能夠對瀏覽器請求進行各種各樣的處理,能夠過濾廣告和Cookie,能夠預先提取Web頁面,使得瀏覽器訪問頁面的速度更快,等等。
一、基礎知識
不管以哪種方式應用代理伺服器,其監控HTTP傳輸的過程總是如下:
步驟一:內部的瀏覽器發送請求給代理伺服器。請求的第一行包含了目標URL。
步驟二:代理伺服器讀取該URL,並把請求轉發給合適的目標伺服器。
步驟三:代理伺服器接收來自Internet目標機器的應答,把應答轉發給合適的內部瀏覽器。

例如,假設有一個企業的雇員試圖訪問www.cn.ibm.com網站。如果沒有代理伺服器,雇員的瀏覽器打開的Socket通向運行這個網站的Web伺服器,從Web伺服器返回的數據也直接傳遞給雇員的瀏覽器。如果瀏覽器被配置成使用代理伺服器,則請求首先到達代理伺服器;隨後,代理伺服器從請求的第一行提取目標URL,打開一個通向www.cn.ibm.com的Socket。當www.cn.ibm.com返回應答時,代理伺服器把應答轉發給雇員的瀏覽器。
當然,代理伺服器並非只適用於企業環境。作為一個開發者,擁有一個自己的代理伺服器是一件很不錯的事情。例如,我們可以用代理伺服器來分析瀏覽器和Web伺服器的交互過程。測試和解決Web應用中存在的問題時,這種功能是很有用的。我們甚至還可以同時使用多個代理伺服器(大多數代理伺服器允許多個伺服器鏈接在一起使用)。例如,我們可以有一個企業的代理伺服器,再加上一個用java編寫的代理伺服器,用來調試應用程序。但應該注意的是,代理伺服器鏈上的每一個伺服器都會對性能產生一定的影響。
二、設計規劃
正如其名字所示,代理伺服器只不過是一種特殊的伺服器。和大多數伺服器一樣,如果要處理多個請求,代理伺服器應該使用線程。下面是一個代理伺服器的基本規劃:
等待來自客戶(Web瀏覽器)的請求。
啟動一個新的線程,以處理客戶連接請求。
讀取瀏覽器請求的第一行(該行內容包含了請求的目標URL)。
分析請求的第一行內容,得到目標伺服器的名字和埠。
打開一個通向目標伺服器(或下一個代理伺服器,如合適的話)的Socket。
把請求的第一行發送到輸出Socket。
把請求的剩餘部分發送到輸出Socket。
把目標Web伺服器返回的數據發送給發出請求的瀏覽器。

當然,如果考慮細節的話,情況會更復雜一些。實際上,這里主要有兩個問題要考慮:第一,從Socket按行讀取數據最適合進一步處理,但這會產生性能瓶頸;第二,兩個Socket之間的連接必需高效。有幾種方法可以實現這兩個目標,但每一種方法都有各自的代價。例如,如果要在數據進入的時候進行過濾,這些數據最好按行讀取;然而,大多數時候,當數據到達代理伺服器時,立即把它轉發出去更適合高效這一要求。另外,數據的發送和接收也可以使用多個獨立的線程,但大量地創建和拆除線程也會帶來性能問題。因此,對於每一個請求,我們將用一個線程處理數據的接收和發送,同時在數據到達代理伺服器時,盡可能快速地把它轉發出去。
三、實例
在用java編寫這個代理伺服器的過程中,注意可重用性是很重要的。因為這樣的話,當我們想要在另一個工程中以不同的方式處理瀏覽器請求時,可以方便地重用該代理伺服器。當然,我們必須注意靈活性和效率之間的平衡。
圖一顯示了本文代理伺服器實例(HttpProxy.java)的輸出界面,當瀏覽器訪問http://www-900.ibm.com/cn/時,代理伺服器向默認日誌設備(即標准輸出設備屏幕)輸出瀏覽器請求的URL。圖二顯示了SubHttpProxy的輸出。SubHttpProxy是HttpProxy的一個簡單擴展。
圖一

圖二

為了構造代理伺服器,我從Thread基類派生出了HttpProxy類(文章正文中出現的代碼是該類的一些片斷,完整的代碼請從本文最後下載)。HttpProxy類包含了一些用來定製代理伺服器行為的屬性,參見Listing 1和表一。
【Listing 1】
/*************************************
* 一個基礎的代理伺服器類
*************************************
*/
import java.net.*;
import java.io.*;
public class HttpProxy extends Thread {
static public int CONNECT_RETRIES=5;
static public int CONNECT_PAUSE=5;
static public int TIME-OUT=50;
static public int BUFSIZ=1024;
static public boolean logging = false;
static public OutputStream log=null;
// 傳入數據用的Socket
protected Socket socket;
// 上級代理伺服器,可選
static private String parent=null;
static private int parentPort=-1;
static public void setParentProxy(String name, int pport) {
parent=name;
parentPort=pport;
}
// 在給定Socket上創建一個代理線程。
public HttpProxy(Socket s) { socket=s; start(); }
public void writeLog(int c, boolean browser) throws IOException {
log.write(c);
}
public void writeLog(byte[] bytes,int offset,
int len, boolean browser) throws IOException {
for (int i=0;i<len;i++) writeLog((int)bytes[offset+i],browser);
}
// 默認情況下,日誌信息輸出到
// 標准輸出設備,
// 派生類可以覆蓋它
public String processHostName(String url, String host, int port, Socket sock) {
java.text.DateFormat cal=java.text.DateFormat.getDateTimeInstance();
System.out.println(cal.format(new java.util.Date()) + " - " +
url + " " + sock.getInetAddress()+"<BR>");
return host;
}

表一
變數/方法 說明
CONNECT_RETRIES 在放棄之前嘗試連接遠程主機的次數。
CONNECT_PAUSE 在兩次連接嘗試之間的暫停時間。
TIME-OUT 等待Socket輸入的等待時間。
BUFSIZ Socket輸入的緩沖大小。
logging 是否要求代理伺服器在日誌中記錄所有已傳輸的數據(true表示「是」)。
log 一個OutputStream對象,默認日誌常式將向該OutputStream對象輸出日誌信息。
setParentProxy 用來把一個代理伺服器鏈接到另一個代理伺服器(需要指定另一個伺服器的名稱和埠)。

當代理伺服器連接到Web伺服器之後,我用一個簡單的循環在兩個Socket之間傳遞數據。這里可能出現一個問題,即如果沒有可操作的數據,調用read方法可能導致程序阻塞,從而掛起程序。為防止出現這個問題,我用setSoTimeout方法設置了Socket的超時時間(參見Listing 2)。這樣,如果某個Socket不可用,另一個仍舊有機會進行處理,我不必創建一個新的線程。
【Listing 2】
// 執行操作的線程
public void run() {
String line;
String host;
int port=80;
Socket outbound=null;
try {
socket.setSoTimeout(TIMEOUT);
InputStream is=socket.getInputStream();
OutputStream os=null;
try {
// 獲取請求行的內容
line="";
host="";
int state=0;
boolean space;
while (true) {
int c=is.read();
if (c==-1) break;
if (logging) writeLog(c,true);
space=Character.isWhitespace((char)c);
switch (state) {
case 0:
if (space) continue;
state=1;
case 1:
if (space) {
state=2;
continue;
}
line=line+(char)c;
break;
case 2:
if (space) continue; // 跳過多個空白字元
state=3;
case 3:
if (space) {
state=4;
// 只分析主機名稱部分
String host0=host;
int n;
n=host.indexOf("//");
if (n!=-1) host=host.substring(n+2);
n=host.indexOf('/');
if (n!=-1) host=host.substring(0,n);
// 分析可能存在的埠號
n=host.indexOf(":");
if (n!=-1) {
port=Integer.parseInt(host.substring(n+1));
host=host.substring(0,n);
}
host=processHostName(host0,host,port,socket);
if (parent!=null) {
host=parent;
port=parentPort;
}
int retry=CONNECT_RETRIES;
while (retry--!=0) {
try {
outbound=new Socket(host,port);
break;
} catch (Exception e) { }
// 等待
Thread.sleep(CONNECT_PAUSE);
}
if (outbound==null) break;
outbound.setSoTimeout(TIMEOUT);
os=outbound.getOutputStream();
os.write(line.getBytes());
os.write(' ');
os.write(host0.getBytes());
os.write(' ');
pipe(is,outbound.getInputStream(),os,socket.getOutputStream());
break;
}
host=host+(char)c;
break;
}
}
}
catch (IOException e) { }
} catch (Exception e) { }
finally {
try { socket.close();} catch (Exception e1) {}
try { outbound.close();} catch (Exception e2) {}
}
}

和所有線程對象一樣,HttpProxy類的主要工作在run方法內完成(見Listing 2)。run方法實現了一個簡單的狀態機,從Web瀏覽器每次一個讀取字元,持續這個過程直至有足夠的信息找出目標Web伺服器。然後,run打開一個通向該Web伺服器的Socket(如果有多個代理伺服器被鏈接在一起,則run方法打開一個通向鏈裡面下一個代理伺服器的Socket)。打開Socket之後,run先把部分的請求寫入Socket,然後調用pipe方法。pipe方法直接在兩個Socket之間以最快的速度執行讀寫操作。
如果數據規模很大,另外創建一個線程可能具有更高的效率;然而,當數據規模較小時,創建新線程所需要的開銷會抵消它帶來的好處。
Listing 3顯示了一個很簡單的main方法,可以用來測試HttpProxy類。大部分的工作由一個靜態的startProxy方法完成(見Listing 4)。這個方法用到了一種特殊的技術,允許一個靜態成員創建HttpProxy類(或HttpProxy類的子類)的實例。它的基本思想是:把一個Class對象傳遞給startProxy類;然後,startProxy方法利用映像API(Reflection API)和getDeclaredConstructor方法確定該Class對象的哪一個構造函數接受一個Socket參數;最後,startProxy方法調用newInstance方法創建該Class對象。
【Listing 3】
// 測試用的簡單main方法
static public void main(String args[]) {
System.out.println("在埠808啟動代理伺服器\n");
HttpProxy.log=System.out;
HttpProxy.logging=false;
HttpProxy.startProxy(808,HttpProxy.class);
}
}

【Listing 4】
static public void startProxy(int port,Class clobj) {
ServerSocket ssock;
Socket sock;
try {
ssock=new ServerSocket(port);
while (true) {
Class [] sarg = new Class[1];
Object [] arg= new Object[1];
sarg[0]=Socket.class;
try {
java.lang.reflect.Constructor cons = clobj.getDeclaredConstructor(sarg);
arg[0]=ssock.accept();
cons.newInstance(arg); // 創建HttpProxy或其派生類的實例
} catch (Exception e) {
Socket esock = (Socket)arg[0];
try { esock.close(); } catch (Exception ec) {}
}
}
} catch (IOException e) {
}
}

利用這種技術,我們可以在不創建startProxy方法定製版本的情況下,擴展HttpProxy類。要得到給定類的Class對象,只需在正常的名字後面加上.class(如果有某個對象的一個實例,則代之以調用getClass方法)。由於我們把Class對象傳遞給了startProxy方法,所以創建HttpProxy的派生類時,就不必再特意去修改startProxy。(下載代碼中包含了一個派生得到的簡單代理伺服器)。
結束語
利用派生類定製或調整代理伺服器的行為有兩種途徑:修改主機的名字,或者捕獲所有通過代理伺服器的數據。processHostName方法允許代理伺服器分析和修改主機名字。如果啟用了日誌記錄,代理伺服器為每一個通過伺服器的字元調用writeLog方法。如何處理這些信息完全由我們自己決定——可以把它寫入日誌文件,可以把它輸出到控制台,或進行任何其他滿足我們要求的處理。writeLog輸出中的一個Boolean標記指示出數據是來自瀏覽器還是Web主機。
和許多工具一樣,代理伺服器本身並不存在好或者壞的問題,關鍵在於如何使用它們。代理伺服器可能被用於侵犯隱私,但也可以阻隔偷窺者和保護網路。即使代理伺服器和瀏覽器不在同一台機器上,我也樂意把代理伺服器看成是一種擴展瀏覽器功能的途徑。例如,在把數據發送給瀏覽器之前,可以用代理伺服器壓縮數據;未來的代理伺服器甚至還可能把頁面從一種語言翻譯成另一種語言……可能性永無止境。

⑦ 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/

⑧ 關於用Java在Tomcat上部署http服務的問題。

你用SOCKET編程需要編寫兩個端,一個是客戶端,一個是服務端。
既然部署上TOMCAT,那麼服務端的編程就變成TOMCAT上服務端的SERVLET的編程。寫一個SERVLET接收請求、返回響應。你想列印什麼都可以。
這個時候客戶端就簡單成一個表單頁面(如登錄頁面那樣),可以使用html,jsp編寫。也可以直接使用URL在瀏覽器中進行請求。也可以仍然SOCKET發送、接收請求。
你需要簡單的學習下SERVLET/JSP的WEB編程。前台的頁面、後台的SERVLET是對socket編程的封裝。

⑨ java 怎麼接收http請求

你需要搭建一個伺服器,才能接受http請求。

閱讀全文

與java搭建http伺服器相關的資料

熱點內容
酒店命令 瀏覽:750
中走絲線切割編程視頻 瀏覽:78
衣服壓縮袋手泵原理 瀏覽:714
通達信編程書籍 瀏覽:981
車用壓縮天然氣瓶閥 瀏覽:971
鞋的程序員 瀏覽:259
車的壓縮比是什麼意思 瀏覽:202
網站源碼怎麼傳到文件夾 瀏覽:914
海南壓縮機在哪裡 瀏覽:491
電腦文件夾清晰的文件結構 瀏覽:839
如何把蘋果手機的app轉到安卓 瀏覽:305
java同步並發 瀏覽:249
fw壓縮圖片 瀏覽:258
淘寶申請源碼靠譜嗎 瀏覽:874
androidupdater 瀏覽:635
c2d游戲源碼大全可復製版 瀏覽:771
電腦怎樣重置網關命令 瀏覽:411
winftplinux 瀏覽:335
推特app界面如何設置成中文 瀏覽:452
太空工程師轉子編程屬性 瀏覽:32