大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Java實(shí)現(xiàn)Web服務(wù)器的代碼

Java實(shí)現(xiàn)Web服務(wù)器的代碼

更新時(shí)間:2022-09-14 12:15:02 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1585次

在日常的開發(fā)中,我們用過很多開源的web服務(wù)器,例如tomcat、apache等等。現(xiàn)在我們自己實(shí)現(xiàn)一個(gè)簡單的web服務(wù)器,基本的功能就是用戶點(diǎn)擊要訪問的資源,服務(wù)器將資源發(fā)送到客戶端的瀏覽器。web服務(wù)基于的是HTTP協(xié)議,用戶在瀏覽器的地址欄輸入要訪問的地址,服務(wù)器如何得到該地址是個(gè)關(guān)鍵。先看下一般的HTTP請求和響應(yīng)報(bào)文的一般格式:

HTTP 請求報(bào)文

HTTP 響應(yīng)報(bào)文

socket類套接字是網(wǎng)絡(luò)連接的斷點(diǎn)。套接字使得應(yīng)用程序可以從網(wǎng)絡(luò)中讀取數(shù)據(jù),可以向網(wǎng)絡(luò)中寫入數(shù)據(jù)。不同計(jì)算機(jī)上的應(yīng)用程序可以通過套接字發(fā)送或接受字節(jié)流。java中提供了Socket類來實(shí)現(xiàn)這個(gè)功能,通過getInputStream和getOutputStream可以獲取網(wǎng)絡(luò)中的輸入輸出流。 但是,光靠Socket類還是不能夠?qū)崿F(xiàn)我們構(gòu)建一個(gè)服務(wù)器應(yīng)用程序的功能的,因?yàn)榉?wù)器必須時(shí)刻待命,因此java里面提供了ServerSocket類來處理等待來自客戶端的請求,當(dāng)ServerSocket接受到了來自客戶端的請求之后,它就會(huì)創(chuàng)建一個(gè)實(shí)例來處理與客戶端的通信。

服務(wù)器應(yīng)用程序的實(shí)現(xiàn) 首先,我們要構(gòu)建一個(gè)封裝請求信息的類requst,一個(gè)響應(yīng)請求的類response,還要有一個(gè)主程序httpServer來處理客戶端來的請求。

下面是代碼:

Request類:

package server;
import java.io.IOException;
import java.io.InputStream;
/**
* 將瀏覽器發(fā)來的請求信息轉(zhuǎn)化成字符和截取url
*/
public class Request {
//輸入流
private InputStream input;
//截取url,如http://localhost:8080/index.html ,截取部分為 /index.html
private String uri;
public Request(InputStream inputStream){
this.input = inputStream;
}
public InputStream getInput() {
return input;
}
public void setInput(InputStream input) {
this.input = input;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
//從套接字中讀取字符信息
public void parse(){
StringBuffer request = new StringBuffer(2048);
int i = 0;
byte[] buffer = new byte[2048];
try {
i = input.read(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
i = -1;
}
for(int j = 0;j
request.append((char)(buffer[j]));
}
System.out.println(request.toString());
uri = parseUri(request.toString());
}
//截取請求的url 截取index.html
private String parseUri(String requestString){
int index1 = 0;
int index2 = 0;
index1 = requestString.indexOf(' ');
if(index1!=-1){
index2 = requestString.indexOf(' ',index1+1);
if(index2>index1){
return requestString.substring(index1+1,index2);
}
}
return null;
}
}
Responselei
package server;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
/**
* 類說明 根據(jù)相應(yīng)信息返回結(jié)果
*/
public class Response {
private static final int BUFFER_SIZE = 1024;
Request request;
OutputStream output;
public Response(OutputStream output){
this.output = output;
}
public void sendStaticResource() throws IOException{
byte[] bytes = new byte[BUFFER_SIZE];
FileInputStream fis = null;
File file = new File(HttpServer.WEB_ROOT,request.getUri());
if(file.exists()){
try {
fis = new FileInputStream(file);
int ch = fis.read(bytes,0,BUFFER_SIZE);
while(ch != -1){
output.write(bytes,0,ch);
ch = fis.read(bytes,0,BUFFER_SIZE);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
if(fis !=null){
fis.close();
}
}
}else{
//找不到文件
String errorMessage = "HTTP/1.1 404 File Not Found\r\n" +
"Content-Type: text/html\r\n" +
"Content-Length: 23\r\n" +
"\r\n" +
"

File Not Found

";
try {

output.write(errorMessage.getBytes());
output.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public Request getRequest() {
return request;
}
public void setRequest(Request request) {
this.request = request;
}
public OutputStream getOutput() {
return output;
}
public void setOutput(OutputStream output) {
this.output = output;
}
public static int getBUFFER_SIZE() {
return BUFFER_SIZE;
}
}

HttpServer類

package server;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**

類說明
時(shí)刻等待前端請求

*/
public class HttpServer {
/**
* @param args
*/
//WEB_ROOT是服務(wù)器的根目錄
public static final String WEB_ROOT = System.getProperty("user.dir")+File.separator+"webroot";
//關(guān)閉的命令
// private static final String SHUTDOWN_COMMAND= "/SHUTDOWN";
public static void main(String[] args) {
// TODO Auto-generated method stub
HttpServer server = new HttpServer();
server.await();
}
public void await(){
ServerSocket serverSocket = null;
int port = 8080;
try {
serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
while(true)
{
try {
Socket socket = null;
InputStream input = null;
OutputStream output = null;
socket = serverSocket.accept();
input = socket.getInputStream();
output = socket.getOutputStream();

封裝request請求

Request request = new Request(input);
request.parse();

封裝response對象

Response response = new Response(output);
response.setRequest(request);
response.sendStaticResource();
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
continue;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

以上就是關(guān)于“Java實(shí)現(xiàn)Web服務(wù)器的代碼”介紹,大家如果想了解更多相關(guān)知識(shí),不妨來關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java視頻教程,里面的課程內(nèi)容從入門到精通,細(xì)致全面,通俗易懂,適合沒有基礎(chǔ)的小伙伴學(xué)習(xí),希望對大家的學(xué)習(xí)能夠有所幫助。

提交申請后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 成人永久免费视频网站在线观看 | 一区二区三区免费精品视频 | 国产视频在线观看福利 | 亚洲性生活视频 | 日韩欧美一级毛片在线 | 亚洲综合在线播放 | 99热成人精品热久久66 | 色综合一区二区三区 | 在线观看成人小视频 | 欧美日韩视频在线成人 | 特级黄色毛片 | 一区二区三区免费在线观看 | 在线观看日韩欧美 | 美女操操 | 99er视频| 奇米影视888| 福利视频免费 | 亚洲欧美精品网站在线观看 | 四虎免费紧急入口观看 | 国产成人a大片大片在线播放 | 九九99久久精品午夜剧场免费 | 国产伊人久久 | 一级成人黄色片 | 四虎精品成人免费影视 | 久久精品国产精品亚洲20 | 精品哟哟国产在线观看 | 国产成人精品无缓存在线播放 | 九九精品免视频国产成人 | 亚洲一区精品视频在线 | 精品国产www | 污视频在线网站 | 国外成人免费高清激情视频 | 777777农村一级毛片 | 站长推荐国产午夜免费视频 | 亚洲国产天堂在线网址 | 一级特黄女人生活片 | 久久在线资源 | 国产精品人成在线播放新网站 | 国产91精品福利在线观看 | 天天爱天天干天天操 | 精品国产一级毛片大全 |