《瘋狂Java講義》學習筆記(十三)網絡編程

1、基本網絡支持

  • 使用InetAddress
    Java提供了InetAddress類來代表IP地址,InetAddress下還有兩個子類:Inet4Address、Inet6Address,分別代表IPv4和IPv6地址
// 可以通過如下兩個靜態方法來獲取InetAddress實例:
getByName(String host):根據主機域名獲取
getByAddress(byte[] addr):根據原始IP獲取
// 常用API:
String getCanonicalHostNam():獲取全限定域名
String getHostAddress():返回對應的IP地址
String getHostName():獲取IP地址的主機名
boolean isReachable():測試是否可以到達該地址
  • 使用URLDecoder和URLEncoder
    在地址頭中如果出現中文字符,可能換轉換成類似亂碼,事實上不是亂碼,這是application/x-www.form-urlencoded MINE字符串
    URLDecoder類包含一個decode(String s,String enc)靜態方法,它可以將看上去是亂碼的特殊字符串轉換成腹痛字符串,類似解密
    URLEncode類包含一個encode(String s,String enc)靜態方法,它可以將普通字符串轉換成application/x-www.form-urlencoded MINE字符串
  • URL、URLConnection和URLPermission
    URL對象代表題哦那詭異資源定位器,它是指向互聯網資源的指針;URL可以由協議名、主機、端口和資源組成:
    protocol://host:port/resourceName
    URI實例代表一個統一資源識別符,它不能定位任何資源,唯一作用就是解析;而URL則包含一個可打開到達該資源的輸入流,可以將URL理解成URI的特例
    常用API:
String getFile():獲取該URL的資源名
String getHost():獲取該URL的主機名
String getPath():獲取該URL的路徑部分
int getPort():獲取該URL的端口
String getProtocol():獲取該URL的協議名稱
String getQuery():獲取該URL的查詢字符串部分
URLConnection openConnection():返回一個URLConnection對象,它代表了與URL所引用的遠程對象的連接
InputStream openStream():打開與此URL的連接,並返回一個用於讀取該URL資源的InputStream

2、基於TCP協議的網絡編程

TCP/IP通訊協議在通信的兩端各建立一個Socket,從而在通信的兩端之間形成網絡虛擬鏈路
IP和TCP這兩個協議的功能不盡相同,也可以分開單獨使用,但它們是在同一時期作爲一個協議來設計的,並且在功能上也是互補的;只有結合兩者,才能保證Internet在複雜的環境下正常運行。凡事要連接到Internet的計算機,都必須同時安裝和使用這兩個協議,因此在實際中常把這兩個協議統稱爲TCP/IP協議
- 使用ServerSocket創建TCP服務器端
Java中能接收其它通信實體連接請求的類是ServerSocket,ServerSocket對象用於監聽來自客戶端的Socket連接,如果沒有連接,它將一直處於等待狀態。ServerSocket包含一個監聽來自客戶端連接請求的方法:

Socket accept():接收到連接請求後返回一個與客戶端Socket對應的Socket
ServerSocket(int port):用指定的端口port來創建一個ServerSocket,該端口應該有一個有效的端口整數值,065535 
ServerSocket(int port,int backlog):backlog用於改變連接隊列長度
ServerSocket(int port,int backlog,InetAddress localAddr):在機器存在多個IP地址的情況下,允許通過localAddr參數來指定將ServerSocket綁定到指定的IP地址

當ServerSocket使用完畢後,應當使用close()方法來關閉該ServerSocket
服務器應該不斷地接收來自客戶端的所有請求,所以Java程序通常會通過循環不斷地調用ServerSocket的accept()方法

ServerSocket ss = new ServerSocket(3000);
white(true){
    Socket s = ss.accept();
}
  • 使用Socket進行通信
Socket(InetAddress/String remoteAddress,int port):創建連接到指定遠程主機、遠程端口的Socket,該構造器沒有指定本本地地址、本地端口,默認使用本地主機的默認IP地址,默認使用系統動態分配的端口
Socket(InetAddress/String remoteAddress,int port,InetAddress localAddr,int localPort):適用於本地主機有多個IP地址的情形
服務端例子:
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(3000);
        while(true){
            Socket s = ss.accept();
            PrintStream ps = new PrintStream(s.getOutputStream());
            ps.println("我是服務端!");
            ps.close();
            s.close();
        }
    }
}

客戶端例子:

public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("127.0.0.1",3000);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = br.readLine();
        System.out.println("來自服務器的數據:"+line);
        br.close();
        socket.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章