国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

用Java實現(xiàn)Web服務(wù)器 HTTP協(xié)議

2019-11-18 15:20:37
字體:
供稿:網(wǎng)友

  一、HTTP協(xié)議的作用原理

  HTTP協(xié)議的作用原理包括四個步驟:

1.連接:Web瀏覽器與Web服務(wù)器建立連接。2.請求:Web瀏覽器通過socket向Web服務(wù)器提交請求。3.應(yīng)答:Web瀏覽器提交請求后,通過HTTP傳送給Web服務(wù)器。Web服務(wù)器接到請求后,進(jìn)行事務(wù)處理,處理結(jié)果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。4.關(guān)系連接:當(dāng)應(yīng)答結(jié)束后,Web瀏覽器與Web服務(wù)器必須斷開,以保證其它Web瀏覽器能夠與Web服務(wù)器建立連接。

二、用java實現(xiàn)Web服務(wù)器的程序設(shè)計

  根據(jù)上述HTTP協(xié)議的作用原理,實現(xiàn)GET請求的Web服務(wù)器程序的方法如下:

1.創(chuàng)建ServerSocket類對象,監(jiān)聽端口8080。這是為了區(qū)別于HTTP的標(biāo)準(zhǔn)TCP/ip端口80而取的;2.等待、接受客戶機(jī)連接到端口8080,得到與客戶機(jī)連接的socket;3.創(chuàng)建與socket關(guān)聯(lián)的輸入流instream和輸入出流outstream;
式為:GET路徑/文件名HTTP/1.0;4.從與socket關(guān)聯(lián)的輸入流instream中讀取一行客戶機(jī)提交的請求信息,請求信息的格式為:GET路徑/文件名HTTP/1.0;5.從請求信息中獲取請求類型。假如請求類型是GET,則從請求信息中獲取所訪問的Html文件名。沒有HTML文件名時,則以index.htm1作為文件名;6.假如HTML文件存在,則打開HTML文件,把HTTP頭信息和HTML文件內(nèi)容通過socket傳回給Web服務(wù)器,然后關(guān)閉文件,否則發(fā)送錯誤信息給Web瀏覽器;7.關(guān)閉與相應(yīng)Web瀏覽器連接的socket字。

  下面的程序是根據(jù)上述方法編寫的,可實現(xiàn)多線程的Web服務(wù)器,以保證多個客戶機(jī)能同時與該Web服務(wù)器連接。

?。疻ebServer.java用Java編寫Web服務(wù)器

 import java.io.*;

 import java.net.*;

 import java.util.Date;

 public class WebServer{

 public static void main(String args[])

{

 int i=1,PORT=8080;

 ServerSocket server=null;

 Socketclient=null;

 try{

 server=new ServerSocket(PORT);

 System.out.PRintln

("Web Server is listening on port"

+server.getLocalPort());

 for(;;){

 client=server.accept();

//接受客戶機(jī)的連接請求

 new Connection Thread(client,i).start();

 i++;

 }

 }catch(Exception e){System.out.println(e);}

 }

 }

/*Connnection Thread類完成

與一個Web瀏覽器的通信*/

 class Connection Thread extends Thread{

 Socket client;//連接Web瀏覽器的socket字

 int counter;//計數(shù)器

 public Connection Thread(Socketcl,int c){

 client=cl;

 counter=c;

 }

 public void run()//線程體

 {

 try{

 String deskIP=client.getInetAddress().toString();

//客戶機(jī)IP地址

 int destport=client.getPort();

//客戶機(jī)端口號

 System.out.println

("Connecction"+counter+":

connected to "+destIP+"on port

 "+destport+".");

 PrintStream outstream=new printStream

(client.getOoutputStream());

 DataInputStreaminstream+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/1.0200OK");

 outstream.println("MIME_version:1.0");

 outstream.println("Content_Type:text/htm1");

 int len=(int)file.length();

 outstream.println("Content_Length:"+len);

 outstream.println("");

 sendfile(outstream,file);//發(fā)送文件

 outstream.flush();

 }else{//文件不存在時

 String notfound="<html><head><title>

Not Found</title></head>

 <body><hl>Error404-File notfound

</hl></body></html>";

 outstream.println("HTTP /1.0 404 no found");

 outstream.println("Content_Type:text /html");

 outstream.println

("Content_Length:" +notfound.length() +2);

 outstream.println("");

 outstream.println(notfound);

 outstream.flush();

 }

 }

 long m1=1;

 while(m10)

 {

 if(s.substring(0,3).equalsIgnoreCase

("GET"))return true;

 }

 return false;

 }

?。@取要訪問的文件名*/

 String getfilename(String s){

 String f=s.substring(s.indexOf('')+1);

 f=f.substring(0,f.indexOf(''));

 try{

 if(f.charAt(0)=='/')

 f=f.substring(1);

 }catch(String IndexOutOfBoundsException e){

 System.out.println("Exception:"+e);

 }

 if(f.equals(""))f="index.html";

 return f;

 }

 /*把指定文件發(fā)送給Web瀏覽器*/

 void sendfile(PrintStream outs,File file){

 try{

 DataInputStreamin=new DataInputStream

(new FileInputStream(file));

 int len=(int)file.length();

 byte buf[]=new byte[len];

 in.readFully(buf);

 outs.write(buf,0,len);

 outs.flush();

 in.close();

 }catch(Exception e){

 System.out.println("Error retrieving file.");

 System.exit(1);

 }

 }

 }

  程序中的Connection Thread線程子類用來分析一個Web瀏覽器提交的請求,并將應(yīng)答信息傳回給Web瀏覽器。其中,getrequest()方法用來檢測客戶的請求是否為"GET";getfilename(s)方法是從客戶請求信息s中獲取要訪問的HTML文件名;sendfile()方法把指定文件內(nèi)容通過socket傳回給Web瀏覽器。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 弋阳县| 隆昌县| 商南县| 和田县| 塘沽区| 宝丰县| 大庆市| 建始县| 习水县| 浦江县| 青岛市| 曲周县| 宝应县| 枣阳市| 崇义县| 阜新| 绥德县| 郑州市| 桃园县| 普宁市| 德惠市| 买车| 金寨县| 黄石市| 马山县| 黄山市| 民丰县| 三明市| 新安县| 当涂县| 佛学| 福泉市| 广丰县| 巍山| 乐山市| 库尔勒市| 资源县| 志丹县| 江城| 云南省| 肇州县|