欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
簡(jiǎn)單的用 Java Socket 編寫(xiě)的 HTTP 服務(wù)器應用,幫助學(xué)習HTTP協(xié)議
/**
 * SimpleHttpServer.java
 
*/

import java.io.*;
import java.net.*;
import java.util.StringTokenizer;

/**
 * 一個(gè)簡(jiǎn)單的用 Java Socket 編寫(xiě)的 HTTP 服務(wù)器應用, 演示了請求和應答的協(xié)議通信內容以及
 * 給客戶(hù)端返回 HTML 文本和二進(jìn)制數據文件(一個(gè)圖片), 同時(shí)展示了 404, 200 等狀態(tài)碼.
 * 首先運行這個(gè)程序,然后打開(kāi)Web瀏覽器,鍵入http://localhost,則這個(gè)程序能夠顯示出瀏覽器發(fā)送了那些信息
 * 并且向瀏覽器返回一個(gè)網(wǎng)頁(yè)和一副圖片, 并測試同瀏覽器對話(huà).
 * 當瀏覽器看到 HTML 中帶有圖片地址時(shí), 則會(huì )發(fā)出第二次連接來(lái)請求圖片等資源.
 * 這個(gè)例子可以幫您理解 Java 的 HTTP 服務(wù)器軟件是基于 J2SE 的 Socket 等軟件編寫(xiě)的概念, 并熟悉
 * HTTP 協(xié)議.
 * 相反的用 Telnet 連接到已有的服務(wù)器則可以幫忙理解瀏覽器的運行過(guò)程和服務(wù)器端的返回內容.
 *
 * <pre>
 *       當用戶(hù)在Web瀏覽器地址欄中輸入一個(gè)帶有http://前綴的URL并按下Enter后,或者在Web頁(yè)面中某個(gè)以http://開(kāi)頭的超鏈接上單擊鼠標,HTTP事務(wù)處理的第一個(gè)階段--建立連接階段就開(kāi)始了.HTTP的默認端口是80.
 *    隨著(zhù)連接的建立,HTTP就進(jìn)入了客戶(hù)向服務(wù)器發(fā)送請求的階段.客戶(hù)向服務(wù)器發(fā)送的請求是一個(gè)有特定格式的ASCII消息,其語(yǔ)法規則為:
 * < Method > < URL > < HTTP Version > <\n>
 * { <Header>:<Value> <\n>}*
 * <\n>
 * { Entity Body }
 *    請求消息的頂端是請求行,用于指定方法,URL和HTTP協(xié)議的版本,請求行的最后是回車(chē)換行.方法有GET,POST,HEAD,PUT,DELETE等.
 * 在請求行之后是若干個(gè)報頭(Header)行.每個(gè)報頭行都是由一個(gè)報頭和一個(gè)取值構成的二元對,報頭和取值之間以":"分隔;報頭行的最后是回車(chē)換行.常見(jiàn)的報頭有Accept(指定MIME媒體類(lèi)型),Accept_Charset(響應消息的編碼方式),Accept_Encoding(響應消息的字符集),User_Agent(用戶(hù)的瀏覽器信息)等.
 *    在請求消息的報頭行之后是一個(gè)回車(chē)換行,表明請求消息的報頭部分結束.在這個(gè)\n之后是請求消息的消息實(shí)體(Entity Body).具體的例子參看httpRequest.txt.
 *     Web服務(wù)器在收到客戶(hù)請求并作出處理之后,要向客戶(hù)發(fā)送應答消息.與請求消息一樣,應答消息的語(yǔ)法規則為:
 * < HTTP Version> <Status Code> [<Message>]<\n>
 * { <Header>:<Value> <\n> } *
 * <\n>
 * { Entity Body }
 *    應答消息的第一行為狀態(tài)行,其中包括了HTTP版本號,狀態(tài)碼和對狀態(tài)碼進(jìn)行簡(jiǎn)短解釋的消息;狀態(tài)行的最后是回車(chē)換行.狀態(tài)碼由3位數字組成,有5類(lèi): 
 * 參看:HTTP應答碼及其意義 
 * 
 * 1XX 保留 
 * 2XX 表示成功 
 * 3XX 表示URL已經(jīng)被移走 
 * 4XX 表示客戶(hù)錯誤 
 * 5XX 表示服務(wù)器錯誤 
 * 例如:415,表示不支持改媒體類(lèi)型;503,表示服務(wù)器不能訪(fǎng)問(wèn).最常見(jiàn)的是200,表示成功.常見(jiàn)的報頭有:Last_Modified(最后修改時(shí)間),Content_Type(消息內容的MIME類(lèi)型),Content_Length(內容長(cháng)度)等.
 *    在報頭行之后也是一個(gè)回車(chē)換行,用以表示應答消息的報頭部分的結束,以及應答消息實(shí)體的開(kāi)始.
 *    下面是一個(gè)應答消息的例子:
 * HTTP/1.0 200 OK
 * Date: Moday,07-Apr-97 21:13:02 GMT
 * Server:NCSA/1.1
 * MIME_Version:1.0
 * Content_Type:text/html
 * Last_Modified:Thu Dec 5 09:28:01 1996
 * Coentent_Length:3107
 * 
 * <HTML><HEAD><TITLE>
</HTML>
 * 
 * 在用Java語(yǔ)言實(shí)現HTTP服務(wù)器時(shí),首先啟動(dòng)一個(gè)java.net.ServerSocket在提供服務(wù)的端口上監聽(tīng)連接.向客戶(hù)返回文本時(shí),可以用PrintWriter,但是如果返回二進(jìn)制數據,則必須使用OutputStream.write(byte[])方法,返回的應答消息字符串可以使用String.getBytes()方法轉換為字節數組返回,或者使用PrintStream的print()方法寫(xiě)入文本,用write(byte[])方法寫(xiě)入二進(jìn)制數據.
 * 
 * </pre>
 * 
@author 劉長(cháng)炯
 * 
@version 1.0 2007-07-24 Sunday
 
*/
public class SimpleHttpServer implements Runnable {
    
/**
     * 
     
*/
    ServerSocket serverSocket;
//服務(wù)器Socket
    
    
/**
     * 服務(wù)器監聽(tīng)端口, 默認為 80.
     
*/
    
public static int PORT=80;//標準HTTP端口
    
    
/**
     * 開(kāi)始服務(wù)器 Socket 線(xiàn)程.
     
*/
    
public SimpleHttpServer() {
        
try {
            serverSocket
=new ServerSocket(PORT);
        } 
catch(Exception e) {
            System.out.println(
"無(wú)法啟動(dòng)HTTP服務(wù)器:"+e.getLocalizedMessage());
        }
        
if(serverSocket==null)  System.exit(1);//無(wú)法開(kāi)始服務(wù)器
        new Thread(this).start();
        System.out.println(
"HTTP服務(wù)器正在運行,端口:"+PORT);
    }
    
    
/**
     * 運行服務(wù)器主線(xiàn)程, 監聽(tīng)客戶(hù)端請求并返回響應.
     
*/
    
public void run() {
        
while(true) {
            
try {
                Socket client
=null;//客戶(hù)Socket
                client=serverSocket.accept();//客戶(hù)機(這里是 IE 等瀏覽器)已經(jīng)連接到當前服務(wù)器
                if(client!=null) {
                    System.out.println(
"連接到服務(wù)器的用戶(hù):"+client);
                    
try {
                        
// 第一階段: 打開(kāi)輸入流
                        BufferedReader in=new BufferedReader(new InputStreamReader(
                                client.getInputStream()));
                        
                        System.out.println(
"客戶(hù)端發(fā)送的請求信息:\n***************");
                        
// 讀取第一行, 請求地址
                        String line=in.readLine();
                        System.out.println(line);
                        String resource
=line.substring(line.indexOf(/),line.lastIndexOf(/)-5);
                        
//獲得請求的資源的地址
                        resource=URLDecoder.decode(resource, "UTF-8");//反編碼 URL 地址
                        String method = new StringTokenizer(line).nextElement().toString();// 獲取請求方法, GET 或者 POST

                        
// 讀取所有瀏覽器發(fā)送過(guò)來(lái)的請求參數頭部信息
                        while( (line = in.readLine()) != null) {
                            System.out.println(line);
                            
                            
if(line.equals("")) break;
                        }
                        
                        
// 顯示 POST 表單提交的內容, 這個(gè)內容位于請求的主體部分
                        if("POST".equalsIgnoreCase(method)) {
                            System.out.println(in.readLine());
                        }
                        
                        System.out.println(
"請求信息結束\n***************");
                        System.out.println(
"用戶(hù)請求的資源是:"+resource);
                        System.out.println(
"請求的類(lèi)型是: " + method);

                        
// GIF 圖片就讀取一個(gè)真實(shí)的圖片數據并返回給客戶(hù)端
                        if(resource.endsWith(".gif")) {
                            fileService(
"images/test.gif", client);
                            closeSocket(client);
                            
continue;
                        }
                        
                        
// 請求 JPG 格式就報錯 404
                        if(resource.endsWith(".jpg")) {
                                                    PrintWriter out
=new PrintWriter(client.getOutputStream(),true);
                        out.println(
"HTTP/1.0 404 Not found");//返回應答消息,并結束應答
                        out.println();// 根據 HTTP 協(xié)議, 空行將結束頭信息
                        out.close();
                        closeSocket(client);
                        
continue;
                        } 
else {
                            
// 用 writer 對客戶(hù)端 socket 輸出一段 HTML 代碼
                            PrintWriter out=new PrintWriter(client.getOutputStream(),true);
                            out.println(
"HTTP/1.0 200 OK");//返回應答消息,并結束應答
                            out.println("Content-Type:text/html;charset=GBK");
                            out.println();
// 根據 HTTP 協(xié)議, 空行將結束頭信息

                            out.println(
"<h1> Hello Http Server</h1>");
                            out.println(
"你好, 這是一個(gè) Java HTTP 服務(wù)器 demo 應用.<br>");
                            out.println(
"您請求的路徑是: " + resource + "<br>");
                            out.println(
"這是一個(gè)支持虛擬路徑的圖片:<img src=‘a(chǎn)bc.gif‘><br>" +
                                    
"<a href=‘a(chǎn)bc.gif‘>點(diǎn)擊打開(kāi)abc.gif, 是個(gè)服務(wù)器虛擬路徑的圖片文件.</a>");
                            out.println(
"<br>這是個(gè)會(huì )反饋 404 錯誤的的圖片:<img src=‘test.jpg‘><br><a href=‘test.jpg‘>點(diǎn)擊打開(kāi)test.jpg</a><br>");
                            out.println(
"<form method=post action=‘/‘>POST 表單 <input name=username value=‘用戶(hù)‘> <input name=submit type=submit value=submit></form>");
                            out.close();

                            closeSocket(client);
                        }
                    } 
catch(Exception e) {
                        System.out.println(
"HTTP服務(wù)器錯誤:"+e.getLocalizedMessage());
                    }
                }
                
//System.out.println(client+"連接到HTTP服務(wù)器");//如果加入這一句,服務(wù)器響應速度會(huì )很慢
            } catch(Exception e) {
                System.out.println(
"HTTP服務(wù)器錯誤:"+e.getLocalizedMessage());
            }
        }
    }
    
    
/**
     * 關(guān)閉客戶(hù)端 socket 并打印一條調試信息.
     * 
@param socket 客戶(hù)端 socket.
     
*/
    
void closeSocket(Socket socket) {
        
try {
            socket.close();
        } 
catch (IOException ex) {
            ex.printStackTrace();
        }
                            System.out.println(socket 
+ "離開(kāi)了HTTP服務(wù)器");        
    }
    
    
/**
     * 讀取一個(gè)文件的內容并返回給瀏覽器端.
     * 
@param fileName 文件名
     * 
@param socket 客戶(hù)端 socket.
     
*/
        
void fileService(String fileName, Socket socket)
    {
            
        
try
        {
            PrintStream out 
= new PrintStream(socket.getOutputStream(), true);
            File fileToSend 
= new File(fileName);
            
if(fileToSend.exists() && !fileToSend.isDirectory())
            {
                out.println(
"HTTP/1.0 200 OK");//返回應答消息,并結束應答
                out.println("Content-Type:application/binary");
                out.println(
"Content-Length:" + fileToSend.length());// 返回內容字節數
                out.println();// 根據 HTTP 協(xié)議, 空行將結束頭信息
                
                FileInputStream fis 
= new FileInputStream(fileToSend);
                
byte data[] = new byte[fis.available()];
                fis.read(data);
                out.write(data);
                out.close();
                fis.close();
            }
        }
        
catch(Exception e)
        {
            System.out.println(
"傳送文件時(shí)出錯:" + e.getLocalizedMessage());
        }
    }
    
    
/**
     * 打印用途說(shuō)明.
     
*/
    
private static void usage() {
        System.out.println(
"Usage: java HTTPServer <port>\nDefault port is 80.");
    }
    
    
    
/**
     * 啟動(dòng)簡(jiǎn)易 HTTP 服務(wù)器
     * 
@param args 
     
*/
    
public static void main(String[] args) {
        
try {
            
if(args.length != 1) {
                usage();
            } 
else if(args.length == 1) {
                PORT 
= Integer.parseInt(args[0]);
            }
        } 
catch (Exception ex) {
            System.err.println(
"Invalid port arguments. It must be a integer that greater than 0");
        }
        
        
new SimpleHttpServer();
    }
    
}
 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
簡(jiǎn)單的用 Java Socket 編寫(xiě)的 HTTP 服務(wù)器應用
Java多線(xiàn)程 Web服務(wù)器簡(jiǎn)單實(shí)現
Socket 實(shí)現同一網(wǎng)絡(luò )下的實(shí)時(shí)通信
淺出Java Socket 編程
一篇不錯的介紹Java Socket編程的文章3 — IT技術(shù)
服務(wù)器端應用程序
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久