java %3cbr%3e字符替换,Java 網絡編程之 (完全總結)

TCP

TCP,傳輸控制協議(Transmission Control Protocol),是面向連接的通信協議。它提供兩台計算機之間的可靠無差錯的數據傳輸。應用程序通過 TCP 進行通訊時,數據源和接收目標之間會建立一個虛擬的連接,這個連接一旦建立,兩台計算機之間就可以把數據作為雙向字節流進行交換。其實基於 TCP 的通信傳輸的數據幀也不是可靠的,只是在發送 TCP 數據幀的時候,接收端每次接收到數據以后就會進行差錯驗證,如果沒有任何問題,就會回饋發送端一個數據幀,告訴它接收成功,發送端就會繼續發送第二個數據包。通過這樣的問答方式就保證了 TCP 傳輸數據的無差錯性。這種行為是靠驅動程序的底層協議來完成的。

UDP

UDP,用戶數據報協議(User Datagram Protocol),是面向無連接的通信協議。它是一個無連接的通信協議,UDP 不保證用戶數據的可靠性傳輸,但能向若干個目標發送數據,和接收若干個數據源的數據。如果一台主機向另一台主機發送 UDP 數據,這個數據會立即發送出去,而不管另一台主機是否准備好接收數據。當網絡狀態異常的時候,會造成 UDP 數據報的丟失。如果另外一台主機接收到了數據,它不會確認是否收到。

ad60de3647e13fdd6ee64576a0c86c66.jpe

Socket

是網絡驅動層提供給應用程序編程接口和一種機制。我們可以把 Socket 比喻成是一個港口碼頭。應用程序只要把貨物放到港口碼頭上,就算完成了貨物的運送。對於接收方應用程序也要創建一個港口碼頭,只需要等待貨物到達碼頭后將貨物取走。

Socket 是在應用程序中創建的,它是通過一種綁定機制與驅動程序建立關系,告訴自己所對應的 IP 和 Port。在網絡上傳輸的每一個數據幀,必須包含發送者的 IP 地址和端口號。創建完 Socket 以后,應用程序寫入到 Socket 的數據,由 Socket 交給驅動程序向網絡上發送數據,計算機從網絡上收到與某個 Socket 綁定的 IP 和 Port 相關的數據后,由驅動程序再交給 Socket ,應用程序就可以從這個 Socket 中讀取接收到的數據。網絡應用程序就是這樣通過 Socket 發送和接收的。

Socket 數據發送過程:

fd20ea6ac3f211be6ec4fc3b9ccf5f9b.jpe

1、由應用程序產生一個 Socket。

2、應用程序調用 bind() 方法,將 Socket 的信息通知給驅動程序。這個 Socket 的信息主要是包括 IP 地址和端口號。

3、應用程序向 Socket 中寫入數據數據。

4、驅動程序從 Socket 中取出數據,並通過網卡發送數據。

Socket 數據接收過程:

c976b2e80c32eda6c989b644aed41fee.jpe

1、由應用程序產生一個 Socket。

2、應用程序調用 bind() 方法,將 Socket 的信息通知給驅動程序。

3、如果驅動程序收到的數據包中,包含了這個 Socket 所包含的 IP 和端口號,那么驅動程序就會把數據處理后傳遞給 Socket 中。

4、當 Socket 當中有數據時,應用程序就將數據從 Socket 中取走。

Java 中的網絡編程類

位於 java.net 包中。

用於 UDP 通信的 Socket 對應的是 DatagramSocket 類。

用於 TCP 通信的 Socket 對應的是 ServerSocket 類。由於 TCP 程序分為客戶端和服務器端,ServerSocket 是用於服務器端,Socket 類用於 TCP 通信的服務器和客戶端。這個服務器端指的是專用於與客戶端進行通信的 Socket ,ServerSocket 是用於接收客戶端連接的 Socket。如果在創建 Socket 時沒有指定端口號,系統就會為它分配一個其它網絡程序還沒有使用的端口號,如果在創建 Socket 時沒有指定 IP 地址,底層驅動程序會選擇計算機上的任意一個 IP 地址作為發送源 IP 地址。對於一般只有一個 IP 地址的計算機不用指定 IP 地址。如果有多個網卡多個 IP 就應該指定特定IP 地址。

UDP 網絡程序

一、DatagramSocket 類(用於創建收發 UDP 數據報的對象)

(1)構造函數:

public DatagramSocket();   // 沒有指定端口號和 IP 地址,接收方可以獲取發送方使用的 IP 地址和端口號。

public DatagramSocket(int port);   // 如果有可能先接收數據。

public DatagramSocket(int port, InetAdderss Iaddr);   // 如果 UDP 程序運行在擁有多個 IP 地址的主機上。

(2)DatagramSocket 的 close() 方法:

當應用程序不再需要使用 DatagramSocket 對象的時候,應該調用 close() 方法,以通知驅動程序釋放對應的資源,系統就可以將這個 DatagramSocket 所對應的端口號交給其它應用程序使用。

(3)send(DatagramPacket p) 方法:用於發送 DatagramSocket 對應的數據包

(4)receive(DatagramPacket p) 方法:用於接收 DatagramSocket 對應的數據包

二、DatagramPacket 類

如果把 DatagramSocket 比作港口碼頭,那么 DatagramPacket 就是發送和接收數據的集裝箱。

(1)構造函數:

public DatagramPacket(byte[] buf, int length);  // 指定了數據包的緩沖區,和緩沖區的大小。(創建接收數據的 DatagramPacket 對象)

public DatagramPacket(byte[] buf, int length, InetAddress address, int port);  // 還指定了接收數據包目標計算機的地址和端口。(創建發送數據的 DatagramPacket 對象)

(2)getInetAddress 和 getPort 方法:

當用於接收數據包的 DatagramPacket 對象,接收到了網絡上發送過來的數據后,對方的  IP 地址和端口號也是封裝在 DatapramPacket 當中的。

(3)getData 和 getLength 方法:

當創建接收方的 DatagramPacket 對象時,因為無法預知對方發送的實際數據報的長度,一般都是定義了一個相對大的字節數組,來作為緩沖區,傳遞給 DatagramPacket 構造函數。getData() 方法就是獲取內存緩沖區,也就是 buf 字節數組。getLength() 方法返回的是DatagramPacket實際接收到的數據的長度。

三、InetAddress 類

是用於表示計算機 IP 地址的類。

(1)getByName() 靜態方法。根據類似 “192.168.0.1” 這些字符串格式的計算機地址,返回一個 InetAddress 實例對象。

(2)getHostAddress() 用於返回一個 InetAddress 對象當中封裝的以 “.” 分割的字符串形式的 IP 地址。

四、編程實例(1) - 編寫發送端和接收端,並實現通信:

發送端:

package cn;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class Send {public static void main(String[] args) throws Exception {// 發送數據System.out.println("請輸入要發送的消息:");BufferedReader cbr = new BufferedReader(new InputStreamReader(System.in));String smsg = cbr.readLine();DatagramSocket sds = new DatagramSocket();DatagramPacket sdp = new DatagramPacket(smsg.getBytes(), smsg.getBytes().length, InetAddress.getByName("127.0.0.1"), 3000);sds.send(sdp);sds.close();}}

接收端:

package cn;import java.net.DatagramPacket;import java.net.DatagramSocket;public class Receive {public static void main(String[] args) throws Exception {byte[] bytse = new byte[1024];DatagramSocket rds = new DatagramSocket(3000);DatagramPacket rdp = new DatagramPacket(bytse, 1024);rds.receive(rdp);String rmsg = new String(rdp.getData(), 0, rdp.getData().length);System.out.println("收到來自(" + rdp.getAddress() + ":" + rdp.getPort()+ ")的消息:" + rmsg);rds.close();}}

運行結果:

a33db017a6117faa710cd3988f6c8701.jpe

編程實例(2)基於 UDP 的網絡聊天程序,可以實現外網聊天:

我已經在我先前的博客中寫了這個程序,地址:http://blog.csdn.net/DriverKing/archive/2011/06/26/6568793.aspx

TCP 網絡程序

一、TCP 網絡程序工作原理:

b23f2365eac5122acefe4cc34bdb2640.jpe

利用 UDP 兩個通信的計算機是平等的,沒有主從之分,而利用 TCP 兩個進行通信的程序,是有主從關系的。一個稱為服務器程序,另一個稱為客戶機程序。兩者的功能和編寫方法大不一樣,

TCP 客戶端與 TCP 服務器端程序的交互過程:

首先,由 TCP 服務器程序創建一個 ServerSocket 類,然后調用 accept() 方法等待客戶端的連接。

其次,客戶端程序創建一個 Socket 並請求與服務器建立連接。

接着,是服務器接收客戶的連接請求,並創建一個與請求相關的新的 Socket 與客戶機專線連接。

再次,建立連接的兩個 Socket 在一個單獨的線程(由服務器創建)上對話。

最后,服務器程序又開始等待新的連接請求,當新的連接請求到達時,它又會重復 2~5 的過程。

二、ServerSocket 類

(1)構造函數:

public ServerSocket(); // 不能直接使用,必須調用它實例對象的 bind() 方法與綁定端口號或 IP

public ServerSocket(int port); // 如果 port 等於 0 ,那么系統將自動分配一個未啟用的端口號,作為 TCP 服務器最好確定端口號,這樣客戶機才能知道連接服務器的哪個端口。(一般用這個)

public ServerSocket(int port, int backlog); // 除了指定端口號外,還可以指定在服務器很忙的時候,可以與之保持連接請求的客戶機數量。沒有指定的話默認為 50。

public ServerSocket(int port, int backlog, InetAddress bindAddr); // 可以指定 ServerSocket 綁定的 IP 地址,適用於多個網卡或多個 IP。

(2)close 方法:

當程序不再使用 ServerSocket 對象時,應該調用 ServerSocket 的 close() 方法,將 ServerSocket 關閉,通知驅動程序釋放所對應保留的資源。系統將會把這個端口號非配給其它應用程序使用。

(3)accept 方法:

程序調用 ServerSocket 對象的 accept() 方法,等待客戶端的請求,一旦 accept() 方法接收了客戶端的請求,這個方法就會返回一個與客戶端建立了專線連接的 Socket 對象。

三、Socket 類

(1)構造函數:

public Socket(); // 不能與任何服務器建立連接,需要調用 Socket 類的 connect( SocketAddress endpoint) 方法才可以使用。(用於一個客戶機連接多個服務器)。

public Socket(String host, int port);

public Socket (InetAddress address, int port); // 第二個和第三個會根據 IP 和端口號去連接服務器。

public Socket(String host, int port, InetAddress localAddr, int localPort);

public Socket(InetAddress address, int port, InetAddress localAddr, int localPort); // 第四個和第五個增加了本地 IP 地址和端口號的綁定。

(2) getInputStream和 getOutputStream方法

getOutputStream() 方法用於返回 Socket 輸入流的對象; getOutputStream () 方法用於返回 Socket 輸出流的對象。Socket 的某一端只要向它的輸出流對象中寫入數據,那么另一端就能從自己的輸入流對象中讀取到數據。

四、編程(1)編寫完善的的 TCP 服務器客戶端程序

此程序已經在先前的博客中寫過,地址:http://blog.csdn.net/DriverKing/archive/2011/06/27/6569414.aspx

(2)編寫服務器一對多的聊天程序

服務器端:

package cn;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;public class TcpServer {public static void main(String[] args) throws Exception {ServerSocket ss = new ServerSocket(3000);while (true) {Socket socket = ss.accept();new Thread(new Task(socket)) {}.start();}}}class Task implements Runnable {Socket socket;public Task(Socket socket) {this.socket = socket;}public void run() {System.out.println(socket.getInetAddress().getHostAddress() + ":"+ socket.getPort() + "--已經上線");new Thread(new ServerSend(socket)) {}.start();new Thread(new ServerReceive(socket)) {}.start();}}class ServerSend implements Runnable {Socket socket;public ServerSend(Socket socket) {this.socket = socket;}public void run() {try {BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));BufferedReader br = null;while (true) {System.out.println("請輸入消息內容:");br = new BufferedReader(new InputStreamReader(System.in));String msg = br.readLine();bw.write(msg + "/r/n");bw.flush();if ("exit".equalsIgnoreCase(msg))break;}br.close();bw.close();socket.close();} catch (Exception e) {e.printStackTrace();}}}class ServerReceive implements Runnable {Socket socket;public ServerReceive(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));while (true) {String msg = br.readLine();if ("exit".equalsIgnoreCase(msg))break;System.out.println("("+ socket.getInetAddress().getHostAddress() + ":"+ socket.getPort() + "):" + msg);}br.close();socket.close();} catch (Exception e) {e.printStackTrace();}}}

客戶端:

package cn;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;public class TcpClient {public static void main(String[] args) throws Exception {Socket socket = new Socket("192.168.2.188", 3000);new Thread(new ClientSend(socket)) {}.start();new Thread(new ClientReceive(socket)) {}.start();}}class ClientSend implements Runnable {Socket socket;public ClientSend(Socket socket) {this.socket = socket;}public void run() {try {BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));BufferedReader br = null;while (true) {System.out.println("請輸入消息內容:");br = new BufferedReader(new InputStreamReader(System.in));String msg = br.readLine();bw.write(msg + "/r/n");bw.flush();if ("exit".equalsIgnoreCase(msg))break;}br.close();bw.close();socket.close();} catch (Exception e) {e.printStackTrace();}};}class ClientReceive implements Runnable {Socket socket;public ClientReceive(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));while (true && !socket.isClosed()) {String msg = br.readLine();if ("exit".equalsIgnoreCase(msg))break;System.out.println("("+ socket.getInetAddress().getHostAddress() + ":"+ socket.getPort() + "):" + msg);}br.close();socket.close();} catch (Exception e) {e.printStackTrace();}}}

運行效果:

b7cb6066e5ac1315686ff31007e01021.jpe

五、在 TCP 網絡連接上傳遞對象

(1)ObjectInputStream 和 ObjectOutputStream 可以從底層輸入流中讀取對象類型的數據,和將對象類型的數據寫入到底層輸出流。

(2)使用 Object InputStream 和 ObjectOutputStream 來包裝底層網絡字節流,TCP 服務器和 TCP 客戶端之間就可以傳遞對象類型的數據。

編程實例:通過網絡傳輸 Java 對象:

package cn;import java.io.ObjectOutputStream;import java.net.Socket;public class TcpClient {public static void main(String[] args) throws Exception {Socket socket = new Socket("192.168.2.188", 3000);Student stu = new Student("DriverKing_斌", 23, "男");ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());oos.writeObject(stu);oos.close();socket.close();}}

package cn;import java.io.ObjectInputStream;import java.net.ServerSocket;import java.net.Socket;public class TcpServer {public static void main(String[] args) throws Exception {ServerSocket ss = new ServerSocket(3000);Socket socket = ss.accept();ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());Student stu = (Student) ois.readObject();System.out.println(stu.getName() + "," + stu.getAge() + ","+ stu.getSex());ois.close();socket.close();ss.close();}}// 輸出// Microsoft Windows [版本 6.1.7600]// 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 D:/>java TcpServer// DriverKing_斌,23,男 D:/>

URL(Uniform Resource Locator 統一資源定位符)

(1)URL 的基本組成:協議、主機名、端口號、資源名。例如:http://bolg.csdn.net/driverking

(2)相對 URL:一個相對的 URL 它不包括協議和主機,它表示 它的路徑與當前文檔或其它的 Internet 資源的主機名相同設置有相同的目錄路徑。

“/a.htm” 表示與主機上某種協議的根目錄。“../a.htm” 表示表示所在目錄的父目錄。“a.htm” 表示它是當前目錄下的子目錄。

(3)URL 編碼規則:例:將 “空格” 轉換為 “+” 號。“0-9、a-z、A-Z” 保持不邊,其它字符使用當前字符編碼的內存中的十六進制格式表示。

HTTP 協議的會話過程

現在廣泛使用的 是 HTTP 1.1版本,HTTP 1.1 相對於HTTP 1.0 來說最大特點就是支持持久性的連接。

(1)   HTTP 1.0 的連接過程 :瀏覽器到 Web 服務器之間的所有通信,都是完全獨立分開的請求與相應對。這種通信過程總是由 Web 瀏覽器發送請求,Web 服務器被動的對請求進行響應。一次響應的處理時間與瀏覽器打開的時間沒有關系,服務器向瀏覽器傳送了請求響應后,這個連接就終結了。瀏覽器與服務器的連接是短暫的,只是在瀏覽器發出請求和服務器返回結果的期間,而不是持續到瀏覽器程序關閉。即使在一個頁面不停的請求數據,你的每一次請求都是與服務器建立一個短暫的連接,而不是共享同一個連接。因此 HTTP 1.0 有性能上的缺陷。

38471a850123faef2b3242721bffd675.jpe

(2)HTTP 1.1 的連接過程 :當客戶機發出第一次請求,然后服務器返回第一次請求的網頁文檔,瀏覽器在解析這個網頁文檔的過程中,發現又要去服務器請求第二次數據,那么它就會再次給服務器發出第二次請求,服務器就會返回第二次請求響應……第 n 次。並且瀏覽器不必等待一次的請求相應完畢,它就可以再一次的發送請求,這樣大大的提高了網頁文檔的傳送效率。客戶機請求的信息和服務器響應的信息都稱之為 HTTP 消息,HTTP 消息是有一定的格式和嚴格規定的。

一個完整的請求消息包括:(1)一個請求行(2)若干消息頭(3)實體內容。例如:

GET www.baidu.com HTTP/1.1  (請求行,后面的內容都屬於消息頭部分)

Accept: */*

Accept-Language:en-us

Connectino: Keep-Alive

Host: localhost

……

這個 HTTP 請求消息中沒有實體內容,但是緊接着消息頭后,必須有一個空行,這是用來分割消息頭和實體內容的,可以來表示消息頭部分已經結束。

一個完整的響應消息包括:(1)一個狀態行(2)若干個消息頭(實體內容)。和請求消息一樣,消息頭和實體內容部分是可選的。消息頭和實體內容之間必須有空行。例如:

HTTP/1.1 200 OK

Server:Microsoft-IIS/5.0

Date:Thu, 13 Jul 2000 05:46:53 GMT

Content-Length:2291(實體內容的長度,HTTP 1.1 必須包含該行)

Content-Type:text/html

Set-Cooike:……

……

……

c26ee625c9f6f15099b2b73e496e8ea9.jpe

(3)幾個常用的 HTTP 消息頭

Connection 用於指定處理完本次請求/響應后,客戶端與服務器是否繼續保持連接。值可以為:Keep-Alive 或 close。HTTP 1.1 默認使用的是持久性連接。

Accept-Language 用於指定客戶機期望服務器返回的文檔所使用的國家語言,可以指定多個以逗號(,)分隔的國家語言。

Content-Length 用於表示實體內容的長度(字節數)

Range 用於指定服務器只需返回文檔中的部分內容及部分內容的范圍。(對於較大文檔的斷點續傳非常有用)。有這樣幾種格式:

1、Range: bytes=100-599(返回第100個字節和第599個字節之間的內容,包括了第100個和第599個,字節的順序從 0 開始計算)

2、Range: bytes=100- (返回文檔中的第100個字節以后的所有內容)

3、Range: bytes=-100 (返回文檔中的最后100個字節的內容)

Content-Range 是與 Range 一起使用的,用於指定服務器返回的部分實體內容的位置信息。只有客戶機使用了 Range 請求后,服務器才會返回 Content-Range 消息。例如:

Content-Range: bytes 2543-4532/7898 (以 Byte 為單位的返回第 2543 - 4532之間的 的數據,7898表示總的實體內容的大小是 7898 個字節)

URL 類(表示 Internet 網絡資源的 URL)

(1)構造函數:

public URL(String sprc); // 直接使用表示 Internet 網絡資源的 URL 字符串來創建 URL 對象。

public URL(String protocol, String host, int port, String file); // 使用協議名,主機名,端口號和資源本身的名稱。

public URL(String protocol, String host, int port, String file, URLStreamHandler handler); // 多了一個對這種資源進行具體處理的協議處理器對象。

public URL(URL context, String spec); // 是在一個已有的 URL 對象基礎上,再加上一個相對的 URL 字符文本來創建一個新的 URL 對象。例如 context 指向的是一個目錄資源,spec 是這個目錄下的文件名,這兩者的組合就成了一個指向這個文件名的完整的 URl。

(2)URL 類本身並不能獲取網絡資源中具體的內容,

(3)openConnection 方法和 URLConnection 對象

openConnection() 方會調用協議處理器,也就是 URLStreamHandler的 openConnetion() 方法,返回一個 URLConnection 對象,URLConnection對象代表與這個 URL 指定的網絡資源的連接,程序調用URLConnectio() 的方法,就可以獲取網絡資源中的具體內容。

(4)setURLStreamHandlerFactory(URLStreamhandlerFacoory fac) 靜態方法

URLStreamhandlerFacoory 用於建立協議名和協議名對應處理器的關系。例如:在創建 URL 對象時指定的是 HTTP 那么它就應該調用 HTTP 協議處理器。

(5)StreamHandlerFactory 類的 createURLStreamHandler(String protocol)

在創建 URL 對象時,Java 虛擬機會根據其中出現的協議名,調用StreamHandlerFactory 對象中的createURLStreamHandler(String protocol)方法,將協議名傳遞進去,在方法內部,它會根據你傳進來的協議名,創建出相應的協議處理器對象,然后返回給 URL 對象。

URLConnection 和 HTTPURLConnection 類

URLConnection對象代表與這個 URL 指定的網絡資源的連接,程序調用URLConnectio() 的方法,就可以獲取網絡資源中的具體內容。URLConnection 本身並不能訪問網絡資源內容都是由它的子類完成的。HTTPConnection 就是 URLConnection 的子類,

(1) URLConnection 的連接過程

在產生URLConnection對象后,URLConnection對象並沒有真正的與 URL 對象指定的網絡資源進行連接,在這之前 URLConnection可以調用各種 set 方法來設置兩者之間的連接參數和屬性。

(2)setRequestProperty() 用來設置各個協議的請求消息頭。

(3)getHeaderFields() 用來獲取 HTTP 的響應消息頭。

(4)getInputStream 和 getOutputStream 分別返回用來讀取 HTTP 響應實體內容的 InputStream 對象和 請求消息內容的 OutputStream 對象。

(5)一個 HTTP 連接可以被多個 HttpURLConnection 實例對象共享,調用HttpURLConnection的 disconnect() 方法可以關閉底層共享網絡。

編程實例:將訪問 http://www.bing.com 站點的 HTTP 請求消息的 Accept-Language 頭分別設置成日文和中文后,然后打印出 www.goolge.com 站點返回的所有響應消息頭和網頁內容

package cn;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;//將訪問 http://www.bing.com 站點的 HTTP 請求消息的 Accept-Language //頭分別設置成日文和中文后,然后打印出 www.goolge.com //站點返回的所有響應消息頭和網頁內容public class HTTPTest {public static void main(String[] args) throws Exception {System.out.println("獲取日文:");getLanguage("ja");System.out.println("/n獲取中文:");getLanguage("zh-cn");}public static void getLanguage(String language) throws Exception {URL url = new URL("http://www.bing.com");HttpURLConnection huc = (HttpURLConnection) url.openConnection();huc.setRequestProperty("Accept-Language", language);huc.connect();// 請求消息頭Map> request = huc.getHeaderFields();Set keySet = request.keySet();Iterator iterator = keySet.iterator();while (iterator.hasNext()) {String key = iterator.next();System.out.println(key + ":" + request.get(key));}// 返回的 http 響應消息頭BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));String info = null;while ((info = br.readLine()) != null) {System.out.println(info);}br.close();huc.disconnect();}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值