天天看點

TCP/UDP/socket/InetAddress~Java網絡(一)多線程

文章目錄

    • TCP和UDP
      • TCP協定
      • UDP協定
      • InetAddress 類
    • Socket通信
    • 案例

java.net 包下使用的網絡

IP位址使用4個位元組 32位

一個位元組的範圍 0~255

ipv6 16個位元組 128位

TCP和UDP

TCP協定

1、使用tcp協定前 必須先建立TCP連接配接 形成傳輸資料通道

2、傳輸前 采用三次握手的方式 可靠的

3、TCP協定進行通信的過長城應用程序:用戶端 服務端

4、連接配接中 可以進行大資料量的傳輸

5、傳輸完畢 需釋放已建立的連接配接 效率低

UDP協定

1、将資料、源、目的封裝資料包 不需要建立連接配接

2、每個資料報的大小限制在64k内

3、因無需連接配接 故不可靠

4、發送的資料結束時 無釋放資源 因為不是面向連接配接的 速度快

InetAddress 類

相關方法

1、擷取本機InetAddress 對象 getLocalHost

2、根據指定主機名 / 域名擷取ip位址對象getByName

3、擷取InetAddress 對象的主機名 getHostName

4、擷取InetAddress 對象的位址getHostAddress

也是序列化的對象

TCP/UDP/socket/InetAddress~Java網絡(一)多線程
public static void main(String[] args) throws UnknownHostException {
        //1、擷取本機的InetAddress對現象
        InetAddress localhost = InetAddress.getLocalHost();
        System.out.println(localhost);
        //2、 根據指定的主機名擷取InetAddress 對象
        InetAddress host1 = InetAddress.getByName("");
        System.out.println(host1);
        //3、根據傳回InetAddress對象 比如百度對應的wwww.baidu.com對應的
        InetAddress host2 = InetAddress.getByName("www.baidu.com");
        System.out.println("host2="+host2;

        //4、通過InetAddress 對象 擷取對應的位址
        String hosrAddress = host2.getHostAddress();

        //5、通過InetAddress 對象 擷取對應的主機名 或者域名
        String hostName  = host2.getHostName();
    }
           

Socket通信

1、套節字開發 廣泛應用與應用程式

2、通信的兩端都需要有Socket 是兩台機器之間通信的端點

3、網絡通信 其實就是Socket間的通信

4、socket 允許程式把網絡當成一個流 資料在兩個socket之間通過IO傳輸

4、一般主動發起通信的應用沉痼屬于用戶端 等待通信請求的為服務端

案例

public static void main(String[] args) throws Exception {
        //1、伺服器在本機監聽8888端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //2、等待連接配接
        Socket socket = serverSocket.accept();
        //3、讀取用戶端發送的資料
        ///通過socket得到輸入的流
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        String destfilepath = "";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destfilepath));

        bos.write(bytes);
        //關閉流
        bos.close();;
        bis.close();
        socket.close();
        serverSocket.close();
    }
           
public class StreamUtils {
    public static byte[] streamToByteArray(InputStream is) throws Exception{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] b = new byte[1024];
        int len;
        while ((len=is.read(b))!=-1){
            bos.write(b,0,len);
        }
        byte[] array = bos.toByteArray();
        bos.close();
        return array;
    }
}
           
public class demo4 {
    public static void main(String[] args) throws Exception {
        //建立用戶端連接配接伺服器 得到socket對象
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        //建立讀取磁盤檔案的輸入流
        String filepath = "";
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(""));
        //bytes就是filePath對應的位元組數組
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        //通過socket擷取到輸出流 将bytes資料發送給服務端
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        bos.write(bytes); //将檔案對應的位元組數組的内容寫入到資料通道中

        bis.close();
        socket.shutdownOutput(); //設定寫入資料的結束标志
        //關閉相對應的流
        bos.close();
        socket.close();
    }
}