網(wǎng)絡(luò)編程

什么是網(wǎng)絡(luò)編程

  • 在網(wǎng)絡(luò)通信協(xié)議下, 不同計算機(jī)上運(yùn)行的程序, 通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸
  • 簡單來說就是計算機(jī)與計算機(jī)之間通過網(wǎng)絡(luò)傳輸數(shù)據(jù)

常見的架構(gòu)

BS架構(gòu)和CS架構(gòu)


常見的軟件架構(gòu)

優(yōu)缺點對比


BS/CS架構(gòu)對比

網(wǎng)絡(luò)編程三要素

  • IP: 設(shè)備在網(wǎng)絡(luò)中的地址, 是唯一的標(biāo)識
  • 端口號: 應(yīng)用程序在設(shè)備中唯一的標(biāo)識
  • 協(xié)議: 數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸規(guī)則, 常見的協(xié)議有UDP, TCP, http, https, ftp

UDP協(xié)議:

  • 用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol)
  • UDP是面向無連接通信協(xié)議(不關(guān)心兩設(shè)備間網(wǎng)絡(luò)是否暢通)
    速度快, 有大小限制一次最多發(fā)送64K, 數(shù)據(jù)不安全, 易丟失數(shù)據(jù)

TCP協(xié)議

  • 傳輸控制協(xié)議TCP(Transmission Control Protocol)
  • TCP協(xié)議是面向連接的通信協(xié)議
    速度慢, 沒有大小限制, 數(shù)據(jù)安全

UDP通信程序(發(fā)送數(shù)據(jù))

  • 創(chuàng)建發(fā)送端的DatagramSocket對象
  • 數(shù)據(jù)打包(DatagramPacket)
  • 發(fā)送數(shù)據(jù)
  • 釋放資源
        //創(chuàng)建發(fā)送端對象
        //可以空參也可以帶參
        //空參則隨機(jī)一個端口進(jìn)行發(fā)送
        //帶參則指定端口發(fā)送
        DatagramSocket ds = new DatagramSocket();

        //打包數(shù)據(jù)
        String str = "云想衣裳花想容";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");//發(fā)送到本機(jī)
        int port = 10086;//發(fā)送到10086端口
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);

        //發(fā)送數(shù)據(jù)
        ds.send(dp);
        //釋放資源
        ds.close();

UDP通信程序(接收數(shù)據(jù))

  • 創(chuàng)建接收端的DatagramSocket對象
  • 接收打包好的數(shù)據(jù)
  • 解析數(shù)據(jù)包
  • 釋放資源
        //創(chuàng)建接收端對象
        //接收端口必須帶參, 之前是發(fā)送到哪個端口, 接收時就要傳遞哪個端口
        DatagramSocket ds = new DatagramSocket(10086);

        //接收數(shù)據(jù)包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        ds.receive(dp);

        //解析數(shù)據(jù)
        InetAddress address = dp.getAddress();
        byte[] data = dp.getData();
        int length = dp.getLength();
        int port = dp.getPort();
        System.out.println("接收到數(shù)據(jù)" + new String(data,0,length));//接收到數(shù)據(jù)云想衣裳花想容
        System.out.println("是從設(shè)備" + address + "的" + port +"端口發(fā)送的");//是從設(shè)備/127.0.0.1的54784端口發(fā)送的

        //釋放資源
        ds.close();

TCP通信程序

  • TCP通信協(xié)議是一種可靠的網(wǎng)絡(luò)協(xié)議, 它在通信的兩端各建立一個Socket對象, 通信之前要保證連接已經(jīng)建立, 通過Socket產(chǎn)生lO流來進(jìn)行網(wǎng)絡(luò)通信


客戶端(Socket)
  • 創(chuàng)建客戶端Socket對象, 與指定服務(wù)端連接
  • 獲取輸出流, 寫數(shù)據(jù)
  • 釋放資源
        //創(chuàng)建客戶端對象
        //發(fā)送到本機(jī)的10000端口
        //在創(chuàng)建對象的同時會連接服務(wù)端, 如果連接不上, 代碼會報錯
        Socket socket = new Socket("127.0.0.1",10000);

        //使用客戶端對象獲取輸出流
        OutputStream os = socket.getOutputStream();
        os.write("霓為衣兮風(fēng)為馬".getBytes());

        //釋放資源
        os.close();
        socket.close();
服務(wù)器(SeverSocket)
  • 創(chuàng)建服務(wù)器端Socket對象(SeverSocket)
  • 監(jiān)聽客戶端連接, 返回一個Socket對象
  • 獲取輸入流, 讀數(shù)據(jù), 并把數(shù)據(jù)顯示在控制臺上
  • 釋放資源
        //創(chuàng)建服務(wù)器對象
        //參數(shù)的端口要與客戶端中發(fā)送到的端口保持一致
        ServerSocket ss = new ServerSocket(10000);

        //監(jiān)聽客戶端的連接
        //如果連接成功, accept方法會返回Socket的對象
        Socket socket = ss.accept();

        //從連接通道中, 獲取輸入流來讀取數(shù)據(jù)
        InputStream is = socket.getInputStream();
        //字節(jié)流不能讀中文, 所以使用轉(zhuǎn)換流將其轉(zhuǎn)換成字符流
        InputStreamReader isr = new InputStreamReader(is);
        int b;
        while ((b = isr.read()) != -1) {
            System.out.print((char) b);//霓為衣兮風(fēng)為馬
        }

        //釋放資源
        isr.close();
        socket.close();
        ss.close();

TCP通信程序三次握手協(xié)議

三次握手

TCP通信程序四次揮手協(xié)議

四次揮手
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容