Java Socket InetAddress類 Socket DatagramPacket TCP、UDP示例

  • 2021 年 1 月 30 日
  • 筆記

java.net :為實現網路應用程式提供類。

 

InetAddress類

方法摘要

方法摘要
boolean equals(Object obj) : 將此對象與指定對象比較。
byte[] getAddress() :返回此 InetAddress 對象的原始 IP 地址。
static InetAddress[] getAllByName(String host) :在給定主機名的情況下,根據系統上配置的名稱服務返回其 IP 地址所組成的數組。
static InetAddress getByAddress(byte[] addr) :在給定原始 IP 地址的情況下,返回 InetAddress 對象。
static InetAddress getByAddress(String host, byte[] addr) : 根據提供的主機名和 IP 地址創建 InetAddress。
static InetAddress getByName(String host) :在給定主機名的情況下確定主機的 IP 地址。
String getCanonicalHostName() :獲取此 IP 地址的完全限定域名。
String getHostAddress() : 返回 IP 地址字元串(以文本表現形式)。
String getHostName() : 獲取此 IP 地址的主機名。
static InetAddress getLocalHost() : 返回本地主機。
int hashCode() :返回此 IP 地址的哈希碼。
String toString() : 將此 IP 地址轉換為 String。
public class Inet_Address {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress address1 = InetAddress.getByName("www.baidu.com");
        System.out.println(address1.getAddress() + " " + address1.getHostName() + " " + address1.getHostAddress() + " " + address1.getCanonicalHostName());
        System.out.println();
    }
}

執行結果:

[B@1b6d3586 www.baidu.com 182.61.200.7 182.61.200.7

Socket

  • 兩個Java應用程式可通過一個雙向的網路的網路通訊連接實現數據交換,雙向鏈路的一端稱為一個Socket。
  • Socket通常用來實現client-server連接。
  • java.net包中定義的兩個類Socket和ServerSocket,分別用來實現雙向連接的Client和Server端。
  • 建立連接時所需的定址資訊為遠程電腦的IP地址和埠號。

ServerSocket

ServerSocket是阻塞式的,啟動後就一直等待客戶端連接。

TCP協議 server client示例

Server端

public class TCPServer {
    public static void main(String[] args) throws Exception {
        //通過6666埠監聽客戶端連接
        ServerSocket ss = new ServerSocket(6666);
        //ServerSocket是阻塞式的,啟動後就一直等待客戶端連接。
        while (true) {
            //accept()允許(等待)一個客戶端連接
            Socket sClient = ss.accept();
            System.out.println("client connect success!");
            //數據輸入流允許應用程式以與機器無關方式從基礎輸入流中讀取基本 Java 數據類型。應用程式可以使用數據輸出流寫入稍後由數據輸入流讀取的數據。
            DataInputStream dis = new DataInputStream(sClient.getInputStream());
            //readUTF 阻塞式
            System.out.println(dis.readUTF());
            //給客戶端發資訊
            OutputStream os = sClient.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF("客戶端IP地址:"+sClient.getInetAddress()+"埠:"+sClient.getPort());
            dos.flush();
            Thread.sleep(3000);
            dis.close();
            dos.close();
            sClient.close();
        }
    }
}

Client 端

public class TCPClient {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("127.0.0.1", 6666);
        OutputStream os = s.getOutputStream();
        //數據輸出流允許應用程式以適當方式將基本 Java 數據類型寫入輸出流中。然後,應用程式可以使用數據輸入流將數據讀入。
        DataOutputStream out = new DataOutputStream(os);
        Thread.sleep(3000);
        out.writeUTF("hello server!");
        //調用flush()方法只是將數據寫入作業系統快取中,並不保證數據會立即發送
        out.flush();
        //接收客戶端地址
        InputStream is = s.getInputStream();
        DataInputStream dis = new DataInputStream(is);
        System.out.println(dis.readUTF());
        out.close();
        dis.close();
        s.close();
    }
}

執行結果

先啟動服務端,在啟動客戶端
在這裡插入圖片描述
在這裡插入圖片描述

UDP協議 server client示例

UDP協議 嚴格意義上UDP不存在Server和Client

server端

public class UDPServer {
    public static void main(String[] args) throws Exception{
        byte buf[] = new byte[1024];
        //接受一個數據包存入Buf[]中
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        //構造數據報套接字 綁定埠 準備接受數據報
        DatagramSocket ds = new DatagramSocket(5555);
        while(true)
        {
            //從此套接字接收數據報包
            ds.receive(dp);
            ByteArrayInputStream ByteArrayInputStream = new ByteArrayInputStream(buf);
            DataInputStream dis = new DataInputStream(ByteArrayInputStream);
            System.out.println(dis.readLong());
            System.out.println(dp.getAddress()+"..."+dp.getPort());

        }

    }
}

client端

public class UDPClient {
    public static void main(String[] args) throws Exception{
        long n = 10000L;
        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bas);
        dos.writeLong(n);

        byte[] buf = bas.toByteArray();
        System.out.println(buf.length);

        DatagramPacket dp = new DatagramPacket(buf, buf.length,
                new InetSocketAddress("127.0.0.1", 5555)
        );
        //Client 使用UDP的6666埠向服務端發數據  如果不指定埠,客戶端將隨機佔用一個埠號
        DatagramSocket ds = new DatagramSocket(6666);
        ds.send(dp);
        ds.close();

    }
}

執行結果

在這裡插入圖片描述
在這裡插入圖片描述

//www.dtmao.cc/news_show_656725.shtml