国产成人黄色,免费观看在线综合,亚洲精品在线a,欧美网站在线

當前位置:首頁 > 滾動 > 正文

Java 網絡編程 —— 客戶端協議處理框架 環球熱點2023-06-03 06:50:13 | 來源:博客園 | 查看: | 評論:0

概述

Java 對客戶程序的通信過程進行了抽象,提供了通用的協議處理框架,該框架封裝了 Socket,主要包括以下類:


(相關資料圖)

URL 類:統一資源定位符,表示客戶程序要訪問的遠程資源URLConnection 類:表示客戶程序與遠程服務器的連接,客戶程序可以從 URLConnection 獲得數據輸入流和輸出流URLStreamHandler 類:協議處理器,主要負責創建與協議相關的 URLConnection 對象ContentHandler 類:內容處理器,負責解析服務器發送的數據,把它轉換為相應的 Java 對象

以上類都位于 java.net 包,除 URL 類為具體類,其余的都是抽象類,對于一種具體的協議,需要創建相應的具體子類。Oracle 公司為協議處理框架提供了基于 HTTP 的實現,它們都位于 JDK 類庫的 sun.net.www 包或者其子包

URL 類的用法

下例的 HtpClient 類利用 URL 類創建了一個簡單的 HTTP 客戶程序,先創建了一個 URL 對象,然后通過它的 openStream()方法獲得一個輸入流,接下來就從這個輸入流中讀取服務器發送的響應結果

public class HttpClient {        public static void main(String args[]) throws IOException {        //http是協議符號        URI url = new URL("http://www.javathinker.net/hello.htm");        //接收響應結果        InputStream in = url.openStream();        ByteArrayOutputStream buffer = new ByteArrayOutputStream();        bytel] buff = new byte[1024];        int len = -l;                while((len = in.read(buff)) != -1) {            buffer.write(buff, 0, len);        }        //把字節數組轉換為字符串        System.out.println(new String(buffer.toByteArray()));    }}

URL 類的構造方法創建 URLStreamHandler 實例的流程如下:

如果在 URL 緩存已經存在這樣的 URLStreamHandler實例,則無須再創建,否則繼續執行下一步

如果程序通過 URL 類的靜態 setURLStreamHandlerFactory()方法設置了 URLStreamHandlerFactory接口的具體實現類,那么就通過這個工廠類的 createURLStreamHandler()方法來構造 URLStreamHandler實例,否則繼續執行下一步

根據系統屬性 java.prolocol.handler.pkgs來決定 URLStreamHandler具體子類的名字,然后對其實例化,假定運行 HttpClient 的命令為:

java -Djava.protocol.handler.pkgs=com.abc.net.www | net.javathinker.protocols HttpClient

以上命令中的 -D 選項設定系統屬性,會先查找并試圖實例化 com.abc.net.www.http.Handler類,如果失敗,再試圖實例化 net.javathinkerprotocols.http.Handler類,如果以上操作都失敗,那么繼續執行下一步

試圖實例化位于 sun.net.www.prolocol包的 sun.netwww.protocol.協議名.Handler類,如果失敗,URL 構造方法就會拋出 MalforedURLException。在本例協議名是 http,會試圖實例化 sun.net.www.protocol.http.Handler

URL 類具有以下方法:

openConnection():創建并返回一個 URLConnection對象,這個 openConnection()方法實際上是通過調用 URLStreamHandler類的 openConnection()方法,來創建 URLConnection對象openStream():返回用于讀取服務器發送數據的輸入流,該方法實際上通過調用 URLConnection類的 getInputStream()方法來獲得輸入流getContent():返回包裝了服務器發送數據的 Java 對象,該方法實際上調用 URLConnection類的 getContent)方法,而 URLConnection類的 getContent()方法又調用了 ContentHandler類的 getContent()方法URLConnection 類的用法

URLConnection 類表示客戶程序與遠程服務器的連接,URLConnection 有兩個 boolean 類型的屬性以及相應的 get 和 set 方法:

dolnput:如果取值為 true,表示允許獲得輸入流,讀取遠程服務器發送的數據該屬性的默認值為 true。程序可通過 getDolnput() 和 setDolnput() 方法來讀取和設置該屬性doOutput:如果取值為 true,表示允許獲得輸出流,向遠程服務器發送數據該屬性的默認值為 false。程序可通過 getDoOutput() 和 setDoOutput() 方法來讀取和設置該屬性

URLConnection 類提供了讀取遠程服務器的響應數據的一系列方法:

getHeaderField(String name):返回響應頭中參數 name 指定的屬性的值getContentType():返回響應正文的類型,如果無法獲取響應正文的類型就返回 nullgetContentLength():返回響應正文的長度,如果無法獲取響應正文的長度,就返回 -1getContentEncoding():返回響應正文的編碼類型,如果無法獲取響應正文的編碼類型,就返回 null

下例的 HtpClient 類利用 URLConnection 類來讀取服務器的響應結果

public class HttpClient {        public static void main(String args[]) throws IOException {        URL url = new URL("http://www,javathinkernet/hello.htm");        URLConnection connection = url.openConnection();        //接收響應結果        System.out.printIn("正文類型:" + connection.getContentType());        System.out.printIn("正文長度:" + connection.getContentLength());        //讀取響應正文        InputStream in = connection.getInputStream();                ByteArrayOutputStream buffer = new ByteArrayOutputStream();        byte[] buff = new byte[1024];        int len = -l;                while((len = in.read(buff)) != -1) {            buffer.write(buff, 0, len);        }                //把字節數組轉換為字符串        System.out.println(new String(buffer.toByteArray()));    }}
實現協議處理框架

本節將為用戶自定義的 ECHO 協議實現處理框架,共創建了以下類:

EchoURLConnection 類:繼承自 URLConnection 類EchoURLStreamHandler 類:繼承自 URLStreamHandler 類EchoURLStreamHandlerFactory 類:實現 URLStreamHandlerFactory 接口EchoContentHandler 類:繼承自 ContentHandler 類EchoContentHandlerFactory 類:實現 ContentHandlerFactory 接口1. 創建 EchoURLConnection 類

EchoURLConnection 類封裝了一個 Socket,在 connect() 方法中創建與遠程服務器連接的 Socket 對象

public class EchoURLConnection extends URLConnection {        private Socket connection = null;    public final static int DEFAULT PORT = 8000;        public EchoURLConnection(URL url) {        super(url);    }        public synchronized InputStream getInputStream() throws IOException {        if(!connected) connect();        return connection.getInputStream();    }        public synchronized OutputStream getOutputStream() throws IOException {        if(!connected) connect();        return connection.getOutputStream();    }        public String getContentType() {        return "text/plain";    }        public synchronized void connect() throws IOException {        if(!connected) {            int port = url.getPort();            if(port < 0 || port > 65535) port = DEFAULT_PORT;            this.connection = new Socket(url.getHost(), port);            this.connected = true;        }    }        public synchronized void disconnect() throws IOException {        if(connected) {            //斷開連接            this.connection.close();            this.connected = false;        }    }}
2. 創建 EchoURLStreamHandler 及工廠類

EchoURLStreamHandler 類的 openConnection()方法負責創建一個 EchoURLConnection 對象

public class EchoURLStreamHandler extends URLStreamHandler {        public int getDefaultPort() {        return 8000;    }        protected URLConnection openConnection(URL url) throws IOException {        return new EchoURLConnection(url);    }}

EchoURLStreamHandlerFactory 類的 createURLStreamHandle()方法負責構造 EchoURLStreamHandler 實例

public class EchoURLStreamHandlerFactory implements URLStreamhandlerFactory {        public URLStreamHandler createURLStreamHandler(String protocol) {        if(protocol.equals("echo"))            return new EchoURLStreamHandler();        else            return null;    }}

在客戶程序中,可以通過以下方式設置 EchoURLStreamHandlerFactory

URL.setURLStreamHandlerFactory(new EchoURLStreamHandlerFactory());URL url=new URL("echo://localhost:8000");
3. 創建 EchoContentHandler 類及工廠類

URLConnection 類還提供了 getContent()方法,它有兩種重載形式:

public Object getContent();public Object getContent(Class[] classes);

第二個 getContent() 方法把服務器發送的數據優先轉換為 classes 數組第一個元素指定的類型,如果轉換失敗,再嘗試轉換第二個元素指定的類型,以此類推

下例 HttpClient 演示處理服務器發送的數據

public class HttpClient {        public static void main(String args[]) throws IOException {        URL url = new URL("http://www,javathinker.net/hello.htm");        URlConnection connection = url.openConnection();        //接收響應結果        InputStream in = connection.getInputStream();        Class[] types = {String.class, InputStream.class};        Object obj = connection.getContent(types);                if(obj instanceof String) {            System.out.println(obj);        } else if(obj instanceof InputStream) {            in = (InputStream) obj;            FileOutputStream file = new FileOutputStream("data");            byte[] buff = new byte[1024];            int len = -l;                        while((len = in.read(buff)) != -1) {                file.write(buff, 0 ,len);            }                        System.out.println("正文保存完畢");        } else {            System.out.println("未知的響應正文類型");        }    }}

EchoContentHandler 類負責處理 EchoServer 服務器發送的數據

public class EchoContentHandler extends ContentHandler {        /** 讀取服務器發送的一行數據,把它轉換為字符串對象 */    public Object getContent(URLConnection connection) throws IOException {    InputStream in = connection.getInputStream();        BufferedReader br = new BufferedReader(new InputStreamReader(in));        return br.readLine();    }        public Object getContent(URLConnection connection, Class[] classes) throws IOException {        InputStream in = connection.getInputStream();        for(int i = 0; i < classes.length; i++) {            if(classes[i] == InputStream.class) {                return in;            } else if(classes[i] == String.class) {                return getContent(connection);            }        }        return null;    }}

第二個 getContent() 方法依次遍歷 classes 參數中的元素,判斷元素是否為 InputSuream 類型或 String 類型,如果是,就返回相應類型的對象,它包含了服務器發送的數據。如果 classes 參數中的元素都不是 InputStream 類型或 String 類型,就返回 null

EchoContentHandlerFactory 類的 createContentHandler() 方法負責創建一個EchoContentHandler 對象

public class EchoContentHandlerFactory implements ContentHandlerFactory {        public ContentHandler createContentHandler(String mimetype) {        if(mimetype.equals("text/plain")) {            return new EchoContentHandler();        } else {            return null;        }    }}

在客戶程序中,可以通過以下方式設置 EchoContentHandlerFactory

URLConnection.setContentHandlerFactory(new EchoContentHandlerFactory());URL url = new URL("echo://localhost:8000");EchoURLConnection connection = (EchoURLConnection)url.openConnection();...//讀取服務器返回的數據,它被包裝為一個字符串對象String echoMsg = (String)connection.getContent();
4. 在 EchoClient 類運用 ECHO 協議處理框架
public class EchoClient {        public static void main(String args[]) throws IOException {        //設置URLStreamHandlerFactory        URL.setURLStreamHandlerFactory(new EchoURLStreamHandlerFactory());        //設置ContentHandlerFactory        URLConnection.setContentHandlerFactory(new EchoContentHandlerFactory());                URL url = new URL("echo://localhost:8000");        EchoURLConnection connection = (EchoURlConnection) url.openConnection();        //允許獲得輸出流        connection.setDoOutput(true);        //獲得輸出流        PrintWriter pw = new PrintWriter(connection.getOutputStream(), true);        while(true) {            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));            String msg = br.readLine();            //向服務器發送消息            pw.println(msg);            //讀取服務器返回的消息            String echoMsg = (String) connection.getContent();            System.out.println(echoMsg);            if(echoMsg.equals("echo:bye")) {                //斷開連接                connection.disconnect();                break;            }        }    }}

上一篇:天天短訊!傷害動物的孩子,一定是心理變態嗎? 全球簡訊:中國首制!“魔都”號下水下一篇:

最近更新
?
国产成人黄色,免费观看在线综合,亚洲精品在线a,欧美网站在线
午夜久久av| 99久久久国产精品美女| 中文字幕av一区二区三区四区| 国产剧情在线观看一区| av高清不卡| 精品香蕉视频| 国产伦精品一区二区三区视频 | 欧美亚洲tv| 亚洲午夜国产成人| av亚洲一区二区三区| 国产精品巨作av| 欧美成人基地 | 91欧美在线| 啪啪国产精品| 日韩电影免费网站| 激情久久久久久| 亚洲精品乱码| 亚洲小说欧美另类婷婷| 亚洲精品黄色| 伊人网在线播放| 九一成人免费视频| 日韩精品第一| 欧美激情三区| 国产精品久久久网站| 亚洲欧美专区| 7777精品| 国产精品66| 99国产精品私拍| 日韩中文字幕不卡| 亚洲精品乱码久久久久久蜜桃麻豆| 国产亚洲精品v| 免费一级片91| 美女视频一区在线观看| 国产精品91一区二区三区| 日韩国产在线一| 国产成人免费| 亚洲黄页一区| 精品一区视频| 日本不卡高清视频| 综合日韩av| 午夜精品影院| 蜜桃久久久久久| 国产亚洲一区二区三区啪| 国产一区二区三区久久| 精品美女久久| 黑丝一区二区三区| 在线精品小视频| 国产精品久久久久久久免费观看 | 日韩在线中文| av资源中文在线天堂| 精品在线网站观看| 国产精品嫩草影院在线看| 99国产精品视频免费观看一公开 | 精品国产亚洲一区二区三区| 日韩福利视频一区| 激情久久久久久久| 日韩亚洲国产欧美| 午夜久久av| 亚洲精品高潮| 日本免费一区二区三区四区| 一区二区小说| 亚洲区欧美区| 深夜福利一区| 欧洲亚洲一区二区三区| 欧美aa在线观看| 亚洲精品欧美| 欧美另类专区| 久久精品国产久精国产| 亚洲精品动态| 电影亚洲精品噜噜在线观看| 欧美一级全黄| 老牛国产精品一区的观看方式| 精品精品国产三级a∨在线| 亚洲青青久久| 日韩一区精品视频| 国产亚洲精品久久久久婷婷瑜伽| 红桃视频欧美| 久久中文字幕av一区二区不卡| 国产亚洲精品精品国产亚洲综合| 国产亚洲精品v| 午夜欧美精品| 模特精品在线| 日本亚洲视频| 男人的天堂亚洲一区| 日韩视频在线一区二区三区 | 国产农村妇女精品一区二区| 精品亚洲精品| 麻豆久久久久久| 麻豆国产一区| 久久精品av麻豆的观看方式| 日本亚洲最大的色成网站www| 免费精品视频最新在线| 久久国产人妖系列| 国产欧美自拍| 国产精品三p一区二区| 精品99在线| 91亚洲国产高清| 激情视频一区二区三区| 最近国产精品视频| 国产九一精品| www在线观看黄色| 伊人成人网在线看| 久久免费黄色| 亚久久调教视频| 婷婷综合电影| 鲁鲁在线中文| 美女黄网久久| 国产精品白丝av嫩草影院| 欧美一区久久久| 婷婷综合电影| 日韩欧美三级| 蜜臀a∨国产成人精品| 毛片不卡一区二区| 国产日韩专区| 国产精品久久久久久久免费软件| 成人在线视频中文字幕| 国产超碰精品| 亚洲资源在线| 98精品视频| 一区三区视频| 嫩呦国产一区二区三区av| 免费欧美日韩| 日本蜜桃在线观看视频| 免费精品视频在线| 久久要要av| 亚洲精品伊人| 在线视频观看日韩| 九九九精品视频| 欧美永久精品| 不卡一区综合视频| 黄毛片在线观看| 亚洲三级精品| 在线观看精品| 久久av导航| 六月丁香综合| а√在线中文在线新版| 亚洲欧美久久| 精品在线播放| 欧美精品导航| 日本vs亚洲vs韩国一区三区二区| 日韩成人亚洲| 欧美极品中文字幕| 激情久久一区二区| 国产日韩在线观看视频| 亚洲一区二区三区高清| 国产一区二区三区四区五区 | 婷婷亚洲五月色综合| 国产精品66| 美女视频网站久久| 欧美伊人久久| 亚洲精品福利| 日韩精品三区四区| 亚洲视频www| 免费日韩av片| 日韩一区二区免费看| 国产精选久久| 日韩午夜精品| 国产精品日本| 蜜臀va亚洲va欧美va天堂 | 自拍自偷一区二区三区| 国产suv精品一区| 久久精品99国产精品| 免费日韩一区二区| 石原莉奈在线亚洲二区| 国产亚洲一级| 欧美日韩高清| 九九久久婷婷| 日韩影院精彩在线| 日本不卡一二三区黄网| 亚欧洲精品视频在线观看| 日韩专区欧美专区| 视频一区二区三区中文字幕| 久久在线视频免费观看| 亚洲先锋成人| 亚洲精品影院在线观看| 亚洲毛片在线免费| 日韩1区2区日韩1区2区| 日韩av一级片| 欧美日韩尤物久久| 日韩专区在线视频| 免费在线成人| 日韩大片免费观看| 啪啪国产精品| 免费观看日韩电影| 久久精品一本| 99成人超碰| 亚洲精品高潮| 欧美日韩一视频区二区| 亚洲啊v在线免费视频| 国产精品99久久久久久董美香| xxxxx性欧美特大| 亚洲欧美日本国产| 欧美va天堂| 国产三级一区| 99国产精品免费视频观看| 亚洲欧美专区| 日韩精品网站| 一区二区三区四区在线观看国产日韩 | 蜜桃视频欧美| 亚洲欧美久久精品|