国产成人黄色,免费观看在线综合,亚洲精品在线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,欧美网站在线
亚洲天堂日韩在线| 国产精品伦理久久久久久| 日韩精品免费一区二区三区| 精品国产亚洲一区二区三区在线 | 国产一区二区三区黄网站| 国产精品日本一区二区不卡视频| 国产日韩欧美一区| 国产亚洲一卡2卡3卡4卡新区| 亚洲精品综合| 日韩精品视频中文字幕| 欧美日韩在线精品一区二区三区激情综合| 日韩欧美美女在线观看| 日韩欧美久久| 国产欧美另类| 久久精品一区二区三区中文字幕| 精品高清久久| 欧美男人天堂| 欧美成人精品| 欧美日韩国产高清| 中文字幕亚洲精品乱码| 91福利精品在线观看| 久久99影视| 久久99国产精品视频| 成人午夜网址| 成人国产精品一区二区网站| 亚洲永久av| 日本在线啊啊| 色88888久久久久久影院| se01亚洲视频 | 福利一区二区免费视频 | 福利视频一区| 国产一区观看| 欧美日韩四区| 亚洲精品美女91| 久久97视频| 99精品电影| 婷婷成人av| 成人午夜毛片| 老鸭窝毛片一区二区三区| 91精品国产自产精品男人的天堂| 国产999精品在线观看| 亚洲一级网站| 日韩精品午夜视频| 电影91久久久| 国产视频一区免费看| 88久久精品| 亚洲深夜视频| 久久午夜精品一区二区| 国产极品模特精品一二| 视频福利一区| 亚洲精品激情| 国产videos久久| 亚洲天堂免费| 亚洲黄色免费看| 少妇高潮一区二区三区99| 热三久草你在线| 涩涩涩久久久成人精品| 在线天堂资源www在线污| 一级欧美视频| 中文字幕在线免费观看视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久精品二区亚洲w码| 红桃视频欧美| 国内自拍视频一区二区三区| 亚洲欧美日韩综合国产aⅴ| 欧美激情五月| 美日韩精品视频| 久久uomeier| 天海翼精品一区二区三区| 日韩深夜视频| 国产午夜一区| 在线亚洲免费| 不卡福利视频| 国产调教精品| 日韩精品一级二级 | 久久99性xxx老妇胖精品| 亚洲作爱视频| 欧美好骚综合网| 欧美亚洲国产日韩| 香蕉久久久久久久av网站| 四虎国产精品免费观看| 亚洲91在线| 午夜国产精品视频免费体验区| 欧美国产免费| 婷婷视频一区二区三区| 欧美影院三区| 成人在线视频中文字幕| 欧美日一区二区三区在线观看国产免| 香蕉精品久久| 久久久久久夜| 国产精品日韩精品在线播放| 丝瓜av网站精品一区二区| 樱桃视频成人在线观看| 国产欧美日韩免费观看| 老牛国产精品一区的观看方式| 精品捆绑调教一区二区三区| 久久av网址| 欧美在线看片| 亚洲午夜久久| 日韩视频久久| 桃色一区二区| 成人一区而且| 麻豆高清免费国产一区| 亚洲欧美日本日韩| 91精品啪在线观看国产18| 精品三级av在线导航| 7777精品| 日韩高清不卡一区二区| 日韩中文欧美在线| 国产精品视区| 伊人久久亚洲美女图片| 在线成人动漫av| 久久婷婷一区| 日韩免费高清| 成人日韩在线| 亚洲综合电影| 在线看片福利| 9999国产精品| 国产一区二区视频在线看| 国产精品jk白丝蜜臀av小说| 日韩精品久久理论片| 一本一道久久a久久| 只有精品亚洲| 在线免费观看亚洲| 亚洲精一区二区三区| 日韩专区欧美专区| 免费视频一区二区| 亚洲91在线| 奇米色欧美一区二区三区| 国产欧美日韩一区二区三区在线| 欧美日韩中文| 久久精品九色| 日韩精品诱惑一区?区三区| 福利精品一区| 国产麻豆久久| 欧美特黄一区| 日韩精品一二区| 日韩久久99| 美女精品久久| 欧美国产一级| 久久视频精品| 亚洲丝袜美腿一区| 日韩国产91| 欧美成人精品一级| 精品丝袜久久| 久久久久国产| 亚洲中字黄色| 日韩国产在线观看一区| 日本不卡一区二区三区| 欧美天堂一区| 福利片在线一区二区| 99久久夜色精品国产亚洲狼 | 日韩在线网址| 91欧美日韩在线| 精品伊人久久| 日韩视频二区| 欧美精品影院| 亚洲伊人av| 激情婷婷综合| 日韩和欧美的一区| 国产夫妻在线| 日韩中文字幕区一区有砖一区| 国产欧美自拍一区| 婷婷激情一区| 亚洲永久精品唐人导航网址| 国产一卡不卡| 中文字幕在线高清| 亚洲在线观看| 久久99国产精品视频| 黄色不卡一区| 国产日韩一区二区三区在线播放| 成人在线视频区| 国产一区白浆| 国产伦一区二区三区| 日韩在线观看不卡| 亚洲欧洲av| 国内揄拍国内精品久久| 欧美女激情福利| 欧美日韩午夜| 99久久九九| 国产探花一区在线观看| 免费高潮视频95在线观看网站| 老鸭窝毛片一区二区三区| 国产高清日韩| 国产婷婷精品| 日本激情一区| 日本伊人午夜精品| 丝袜av一区| 亚洲日本在线观看视频| 日韩大片免费观看| 日本伊人午夜精品| se01亚洲视频| 欧美日韩在线精品一区二区三区激情综合| 91精品韩国| 欧美一区免费| 一区免费在线| 高清不卡一区| 国产日韩一区| 免费观看在线色综合| 日韩成人三级|