国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之網(wǎng)絡(luò)編程(三十七)

這篇具有很好參考價(jià)值的文章主要介紹了從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之網(wǎng)絡(luò)編程(三十七)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 網(wǎng)絡(luò)編程入門

1.1 網(wǎng)絡(luò)編程概述

  • 計(jì)算機(jī)網(wǎng)絡(luò)

    是指將地理位置不同的具有獨(dú)立功能的多臺(tái)計(jì)算機(jī)及其外部設(shè)備,通過(guò)通信線路連接起來(lái),在網(wǎng)絡(luò)操作系統(tǒng),網(wǎng)絡(luò)管理軟件及網(wǎng)絡(luò)通信協(xié)議的管理和協(xié)調(diào)下,實(shí)現(xiàn)資源共享和信息傳遞的計(jì)算機(jī)系統(tǒng)。

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

    在網(wǎng)絡(luò)通信協(xié)議下,不同計(jì)算機(jī)上運(yùn)行的程序,可以進(jìn)行數(shù)據(jù)傳輸。

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

  • IP地址

    要想讓網(wǎng)絡(luò)中的計(jì)算機(jī)能夠互相通信,必須為每臺(tái)計(jì)算機(jī)指定一個(gè)標(biāo)識(shí)號(hào),通過(guò)這個(gè)標(biāo)識(shí)號(hào)來(lái)指定要接收數(shù)據(jù)的計(jì)算機(jī)和識(shí)別發(fā)送的計(jì)算機(jī),而IP地址就是這個(gè)標(biāo)識(shí)號(hào)。也就是設(shè)備的標(biāo)識(shí)。

  • 端口

    網(wǎng)絡(luò)的通信,本質(zhì)上是兩個(gè)應(yīng)用程序的通信。每臺(tái)計(jì)算機(jī)都有很多的應(yīng)用程序,那么在網(wǎng)絡(luò)通信時(shí),如何區(qū)分這些應(yīng)用程序呢?如果說(shuō)IP地址可以唯一標(biāo)識(shí)網(wǎng)絡(luò)中的設(shè)備,那么端口號(hào)就可以唯一標(biāo)識(shí)設(shè)備中的應(yīng)用程序了。也就是應(yīng)用程序的標(biāo)識(shí)。

  • 協(xié)議

    通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)可以使多臺(tái)計(jì)算機(jī)實(shí)現(xiàn)連接,位于同一個(gè)網(wǎng)絡(luò)中的計(jì)算機(jī)在進(jìn)行連接和通信時(shí)需要遵守一定的規(guī)則,這就好比在道路中行駛的汽車一定要遵守交通規(guī)則一樣。在計(jì)算機(jī)網(wǎng)絡(luò)中,這些連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議,它對(duì)數(shù)據(jù)的傳輸格式、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定,通信雙方必須同時(shí)遵守才能完成數(shù)據(jù)交換。常見(jiàn)的協(xié)議有UDP協(xié)議和TCP協(xié)議。

1.3 IP地址

IP地址:是網(wǎng)絡(luò)中設(shè)備的唯一標(biāo)識(shí)。

  • IP地址分為兩大類
    • IPv4:是給每個(gè)連接在網(wǎng)絡(luò)上的主機(jī)分配一個(gè)32bit地址。按照TCP/IP規(guī)定,IP地址用二進(jìn)制來(lái)表示,每個(gè)IP地址長(zhǎng)32bit,也就是4個(gè)字節(jié)。例如一個(gè)采用二進(jìn)制形式的IP地址是“11000000 10101000 00000001 01000010”,這么長(zhǎng)的地址,處理起來(lái)也太費(fèi)勁了。為了方便使用,IP地址經(jīng)常被寫成十進(jìn)制的形式,中間使用符號(hào)“.”分隔不同的字節(jié)。于是,上面的IP地址可以表示為“192.168.1.66”。IP地址的這種表示法叫做“點(diǎn)分十進(jìn)制表示法”,這顯然比1和0容易記憶得多。
    • IPv6:由于互聯(lián)網(wǎng)的蓬勃發(fā)展,IP地址的需求量愈來(lái)愈大,但是網(wǎng)絡(luò)地址資源有限,使得IP的分配越發(fā)緊張。為了擴(kuò)大地址空間,通過(guò)IPv6重新定義地址空間,采用128位地址長(zhǎng)度,每16個(gè)字節(jié)一組,分成8組十六進(jìn)制數(shù),這樣就解決了網(wǎng)絡(luò)地址資源數(shù)量不夠的問(wèn)題。
  • DOS常用命令:
    • ipconfig:查看本機(jī)IP地址
    • ping IP地址:檢查網(wǎng)絡(luò)是否連通
  • 特殊IP地址:
    • 127.0.0.1:是回送地址,可以代表本機(jī)地址,一般用來(lái)測(cè)試使用。

1.4 InetAddress

InetAddress:此類表示Internet協(xié)議(IP)地址。

  • 相關(guān)方法

    方法名 說(shuō)明
    static InetAddress getByName(String host) 確定主機(jī)名稱的IP地址。主機(jī)名稱可以是機(jī)器名稱,也可以是IP地址
    String getHostName() 獲取此IP地址的主機(jī)名
    String getHostAddress() 返回文本顯示中的IP地址字符串
  • 代碼演示

    public class InetAddressDemo {
        public static void main(String[] args) throws UnknownHostException {
    		//InetAddress address = InetAddress.getByName("itheima");
            InetAddress address = InetAddress.getByName("192.168.1.66");
    
            //public String getHostName():獲取此IP地址的主機(jī)名
            String name = address.getHostName();
            //public String getHostAddress():返回文本顯示中的IP地址字符串
            String ip = address.getHostAddress();
    
            System.out.println("主機(jī)名:" + name);
            System.out.println("IP地址:" + ip);
        }
    }
    

1.5 端口和協(xié)議

  • 端口

    • 設(shè)備上應(yīng)用程序的唯一標(biāo)識(shí)。
  • 端口號(hào)

    • 用兩個(gè)字節(jié)表示的整數(shù),它的取值范圍是065535。其中,01023之間的端口號(hào)用于一些知名的網(wǎng)絡(luò)服務(wù)和應(yīng)用,普通的應(yīng)用程序需要使用1024以上的端口號(hào)。如果端口號(hào)被另外一個(gè)服務(wù)或應(yīng)用所占用,會(huì)導(dǎo)致當(dāng)前程序啟動(dòng)失敗。
  • 協(xié)議

    • 計(jì)算機(jī)網(wǎng)絡(luò)中,連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議。
  • UDP協(xié)議

    • 用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol)
    • UDP是無(wú)連接通信協(xié)議,即在數(shù)據(jù)傳輸時(shí),數(shù)據(jù)的發(fā)送端和接收端不建立邏輯連接。簡(jiǎn)單來(lái)說(shuō),當(dāng)一臺(tái)計(jì)算機(jī)向另外一臺(tái)計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí),發(fā)送端不會(huì)確認(rèn)接收端是否存在,就會(huì)發(fā)出數(shù)據(jù),同樣接收端在收到數(shù)據(jù)時(shí),也不會(huì)向發(fā)送端反饋是否收到數(shù)據(jù)。
    • 由于使用UDP協(xié)議消耗系統(tǒng)資源小,通信效率高,所以通常都會(huì)用于音頻、視頻和普通數(shù)據(jù)的傳輸。
    • 例如視頻會(huì)議通常采用UDP協(xié)議,因?yàn)檫@種情況即使偶爾丟失一兩個(gè)數(shù)據(jù)包,也不會(huì)對(duì)接收結(jié)果產(chǎn)生太大影響。但是在使用UDP協(xié)議傳送數(shù)據(jù)時(shí),由于UDP的面向無(wú)連接性,不能保證數(shù)據(jù)的完整性,因此在傳輸重要數(shù)據(jù)時(shí)不建議使用UDP協(xié)議。
  • TCP協(xié)議

    • 傳輸控制協(xié)議 (Transmission Control Protocol)

    • TCP協(xié)議是面向連接的通信協(xié)議,即傳輸數(shù)據(jù)之前,在發(fā)送端和接收端建立邏輯連接,然后再傳輸數(shù)據(jù),它提供了兩臺(tái)計(jì)算機(jī)之間可靠無(wú)差錯(cuò)的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務(wù)器端,由客戶端向服務(wù)端發(fā)出連接請(qǐng)求,每次連接的創(chuàng)建都需要經(jīng)過(guò)“三次握手”。

    • 三次握手:TCP協(xié)議中,在發(fā)送數(shù)據(jù)的準(zhǔn)備階段,客戶端與服務(wù)器之間的三次交互,以保證連接的可靠。

      第一次握手,客戶端向服務(wù)器端發(fā)出連接請(qǐng)求,等待服務(wù)器確認(rèn)。

      第二次握手,服務(wù)器端向客戶端回送一個(gè)響應(yīng),通知客戶端收到了連接請(qǐng)求。

      第三次握手,客戶端再次向服務(wù)器端發(fā)送確認(rèn)信息,確認(rèn)連接。

    • 完成三次握手,連接建立后,客戶端和服務(wù)器就可以開始進(jìn)行數(shù)據(jù)傳輸了。由于這種面向連接的特性,TCP協(xié)議可以保證傳輸數(shù)據(jù)的安全,所以應(yīng)用十分廣泛。例如上傳文件、下載文件、瀏覽網(wǎng)頁(yè)等。

2.UDP通信程序

2.1 UDP發(fā)送數(shù)據(jù)

  • Java中的UDP通信

    • UDP協(xié)議是一種不可靠的網(wǎng)絡(luò)協(xié)議,它在通信的兩端各建立一個(gè)Socket對(duì)象,但是這兩個(gè)Socket只是發(fā)送,接收數(shù)據(jù)的對(duì)象,因此對(duì)于基于UDP協(xié)議的通信雙方而言,沒(méi)有所謂的客戶端和服務(wù)器的概念。
    • Java提供了DatagramSocket類作為基于UDP協(xié)議的Socket。
  • 構(gòu)造方法

    方法名 說(shuō)明
    DatagramSocket() 創(chuàng)建數(shù)據(jù)報(bào)套接字并將其綁定到本機(jī)地址上的任何可用端口
    DatagramPacket(byte[] buf,int len,InetAddress add,int port) 創(chuàng)建數(shù)據(jù)包,發(fā)送長(zhǎng)度為len的數(shù)據(jù)包到指定主機(jī)的指定端口
  • 相關(guān)方法

    方法名 說(shuō)明
    void send(DatagramPacket p) 發(fā)送數(shù)據(jù)報(bào)包
    void close() 關(guān)閉數(shù)據(jù)報(bào)套接字
    void receive(DatagramPacket p) 從此套接字接受數(shù)據(jù)報(bào)包
  • 發(fā)送數(shù)據(jù)的步驟

    • 創(chuàng)建發(fā)送端的Socket對(duì)象(DatagramSocket)
    • 創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包
    • 調(diào)用DatagramSocket對(duì)象的方法發(fā)送數(shù)據(jù)
    • 關(guān)閉發(fā)送端
  • 代碼演示

    public class SendDemo {
        public static void main(String[] args) throws IOException {
            //創(chuàng)建發(fā)送端的Socket對(duì)象(DatagramSocket)
            // DatagramSocket() 構(gòu)造數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的任何可用端口
            DatagramSocket ds = new DatagramSocket();
    
            //創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包
            //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            //構(gòu)造一個(gè)數(shù)據(jù)包,發(fā)送長(zhǎng)度為 length的數(shù)據(jù)包到指定主機(jī)上的指定端口號(hào)。
            byte[] bys = "hello,udp,我來(lái)了".getBytes();
    
            DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("127.0.0.1"),10086);
    
            //調(diào)用DatagramSocket對(duì)象的方法發(fā)送數(shù)據(jù)
            //void send(DatagramPacket p) 從此套接字發(fā)送數(shù)據(jù)報(bào)包
            ds.send(dp);
    
            //關(guān)閉發(fā)送端
            //void close() 關(guān)閉此數(shù)據(jù)報(bào)套接字
            ds.close();
        }
    }
    

2.2UDP接收數(shù)據(jù)

  • 接收數(shù)據(jù)的步驟

    • 創(chuàng)建接收端的Socket對(duì)象(DatagramSocket)
    • 創(chuàng)建一個(gè)數(shù)據(jù)包,用于接收數(shù)據(jù)
    • 調(diào)用DatagramSocket對(duì)象的方法接收數(shù)據(jù)
    • 解析數(shù)據(jù)包,并把數(shù)據(jù)在控制臺(tái)顯示
    • 關(guān)閉接收端
  • 構(gòu)造方法

    方法名 說(shuō)明
    DatagramPacket(byte[] buf, int len) 創(chuàng)建一個(gè)DatagramPacket用于接收長(zhǎng)度為len的數(shù)據(jù)包
  • 相關(guān)方法

    方法名 說(shuō)明
    byte[] getData() 返回?cái)?shù)據(jù)緩沖區(qū)
    int getLength() 返回要發(fā)送的數(shù)據(jù)的長(zhǎng)度或接收的數(shù)據(jù)的長(zhǎng)度
  • 示例代碼

    public class ReceiveDemo {
        public static void main(String[] args) throws IOException {
          	//創(chuàng)建接收端的Socket對(duì)象(DatagramSocket)
          	DatagramSocket ds = new DatagramSocket(12345);
    
          	//創(chuàng)建一個(gè)數(shù)據(jù)包,用于接收數(shù)據(jù)
          	byte[] bys = new byte[1024];
          	DatagramPacket dp = new DatagramPacket(bys, bys.length);
    
          	//調(diào)用DatagramSocket對(duì)象的方法接收數(shù)據(jù)
          	ds.receive(dp);
    
          	//解析數(shù)據(jù)包,并把數(shù)據(jù)在控制臺(tái)顯示
          	System.out.println("數(shù)據(jù)是:" + new String(dp.getData(), 0,                                             dp.getLength()));
            }
        }
    }
    

2.3UDP通信程序練習(xí)

  • 案例需求

    UDP發(fā)送數(shù)據(jù):數(shù)據(jù)來(lái)自于鍵盤錄入,直到輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結(jié)束。

    UDP接收數(shù)據(jù):因?yàn)榻邮斩瞬恢腊l(fā)送端什么時(shí)候停止發(fā)送,故采用死循環(huán)接收。

  • 代碼實(shí)現(xiàn)

    /*
        UDP發(fā)送數(shù)據(jù):
            數(shù)據(jù)來(lái)自于鍵盤錄入,直到輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結(jié)束
     */
    public class SendDemo {
        public static void main(String[] args) throws IOException {
            //創(chuàng)建發(fā)送端的Socket對(duì)象(DatagramSocket)
            DatagramSocket ds = new DatagramSocket();
            //鍵盤錄入數(shù)據(jù)
            Scanner sc = new Scanner(System.in);
            while (true) {
              	String s = sc.nextLine();
                //輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結(jié)束
                if ("886".equals(s)) {
                    break;
                }
                //創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包
                byte[] bys = s.getBytes();
                DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.1.66"), 12345);
    
                //調(diào)用DatagramSocket對(duì)象的方法發(fā)送數(shù)據(jù)
                ds.send(dp);
            }
            //關(guān)閉發(fā)送端
            ds.close();
        }
    }
    
    /*
        UDP接收數(shù)據(jù):
            因?yàn)榻邮斩瞬恢腊l(fā)送端什么時(shí)候停止發(fā)送,故采用死循環(huán)接收
     */
    public class ReceiveDemo {
        public static void main(String[] args) throws IOException {
            //創(chuàng)建接收端的Socket對(duì)象(DatagramSocket)
            DatagramSocket ds = new DatagramSocket(12345);
            while (true) {
                //創(chuàng)建一個(gè)數(shù)據(jù)包,用于接收數(shù)據(jù)
                byte[] bys = new byte[1024];
                DatagramPacket dp = new DatagramPacket(bys, bys.length);
                //調(diào)用DatagramSocket對(duì)象的方法接收數(shù)據(jù)
                ds.receive(dp);
                //解析數(shù)據(jù)包,并把數(shù)據(jù)在控制臺(tái)顯示
                System.out.println("數(shù)據(jù)是:" + new String(dp.getData(), 0, dp.getLength()));
            }
            //關(guān)閉接收端
    //        ds.close();
        }
    }
    

2.4UDP三種通訊方式

  • 單播

    單播用于兩個(gè)主機(jī)之間的端對(duì)端通信。

  • 組播

    組播用于對(duì)一組特定的主機(jī)進(jìn)行通信。

  • 廣播

    廣播用于一個(gè)主機(jī)對(duì)整個(gè)局域網(wǎng)上所有主機(jī)上的數(shù)據(jù)通信。

2.5UDP組播實(shí)現(xiàn)

  • 實(shí)現(xiàn)步驟

    • 發(fā)送端
      1. 創(chuàng)建發(fā)送端的Socket對(duì)象(DatagramSocket)
      2. 創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包(DatagramPacket)
      3. 調(diào)用DatagramSocket對(duì)象的方法發(fā)送數(shù)據(jù)(在單播中,這里是發(fā)給指定IP的電腦但是在組播當(dāng)中,這里是發(fā)給組播地址)
      4. 釋放資源
    • 接收端
      1. 創(chuàng)建接收端Socket對(duì)象(MulticastSocket)
      2. 創(chuàng)建一個(gè)箱子,用于接收數(shù)據(jù)
      3. 把當(dāng)前計(jì)算機(jī)綁定一個(gè)組播地址
      4. 將數(shù)據(jù)接收到箱子中
      5. 解析數(shù)據(jù)包,并打印數(shù)據(jù)
      6. 釋放資源
  • 代碼實(shí)現(xiàn)

    // 發(fā)送端
    public class ClinetDemo {
        public static void main(String[] args) throws IOException {
            // 1. 創(chuàng)建發(fā)送端的Socket對(duì)象(DatagramSocket)
            DatagramSocket ds = new DatagramSocket();
            String s = "hello 組播";
            byte[] bytes = s.getBytes();
            InetAddress address = InetAddress.getByName("224.0.1.0");
            int port = 10000;
            // 2. 創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包(DatagramPacket)
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
            // 3. 調(diào)用DatagramSocket對(duì)象的方法發(fā)送數(shù)據(jù)(在單播中,這里是發(fā)給指定IP的電腦但是在組播當(dāng)中,這里是發(fā)給組播地址)
            ds.send(dp);
            // 4. 釋放資源
            ds.close();
        }
    }
    // 接收端
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            // 1. 創(chuàng)建接收端Socket對(duì)象(MulticastSocket)
            MulticastSocket ms = new MulticastSocket(10000);
            // 2. 創(chuàng)建一個(gè)箱子,用于接收數(shù)據(jù)
            DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
            // 3. 把當(dāng)前計(jì)算機(jī)綁定一個(gè)組播地址,表示添加到這一組中.
            ms.joinGroup(InetAddress.getByName("224.0.1.0"));
            // 4. 將數(shù)據(jù)接收到箱子中
            ms.receive(dp);
            // 5. 解析數(shù)據(jù)包,并打印數(shù)據(jù)
            byte[] data = dp.getData();
            int length = dp.getLength();
            System.out.println(new String(data,0,length));
            // 6. 釋放資源
            ms.close();
        }
    }
    

2.6UDP廣播實(shí)現(xiàn)

  • 實(shí)現(xiàn)步驟

    • 發(fā)送端
      1. 創(chuàng)建發(fā)送端Socket對(duì)象(DatagramSocket)。
      2. 創(chuàng)建存儲(chǔ)數(shù)據(jù)的箱子,將廣播地址封裝進(jìn)去。
      3. 發(fā)送數(shù)據(jù)。
      4. 釋放資源。
    • 接收端
      1. 創(chuàng)建接收端的Socket對(duì)象(DatagramSocket)。
      2. 創(chuàng)建一個(gè)數(shù)據(jù)包,用于接收數(shù)據(jù)。。
      3. 調(diào)用DatagramSocket對(duì)象的方法接收數(shù)據(jù)。
      4. 解析數(shù)據(jù)包,并把數(shù)據(jù)在控制臺(tái)顯示。
      5. 關(guān)閉接收端。
  • 代碼實(shí)現(xiàn)

    // 發(fā)送端
    public class ClientDemo {
        public static void main(String[] args) throws IOException {
          	// 1. 創(chuàng)建發(fā)送端Socket對(duì)象(DatagramSocket)
            DatagramSocket ds = new DatagramSocket();
    		// 2. 創(chuàng)建存儲(chǔ)數(shù)據(jù)的箱子,將廣播地址封裝進(jìn)去
            String s = "廣播 hello";
            byte[] bytes = s.getBytes();
            InetAddress address = InetAddress.getByName("255.255.255.255");
            int port = 10000;
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
    		// 3. 發(fā)送數(shù)據(jù)
            ds.send(dp);
    		// 4. 釋放資源
            ds.close();
        }
    }
    
    // 接收端
    public class ServerDemo {
        public static void main(String[] args) throws IOException {
            // 1. 創(chuàng)建接收端的Socket對(duì)象(DatagramSocket)
            DatagramSocket ds = new DatagramSocket(10000);
            // 2. 創(chuàng)建一個(gè)數(shù)據(jù)包,用于接收數(shù)據(jù)
            DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
            // 3. 調(diào)用DatagramSocket對(duì)象的方法接收數(shù)據(jù)
            ds.receive(dp);
            // 4. 解析數(shù)據(jù)包,并把數(shù)據(jù)在控制臺(tái)顯示
            byte[] data = dp.getData();
            int length = dp.getLength();
            System.out.println(new String(data,0,length));
            // 5. 關(guān)閉接收端
            ds.close();
        }
    }
    

3. TCP通信程序

3.1TCP發(fā)送數(shù)據(jù)

  • Java中的TCP通信

    • Java對(duì)基于TCP協(xié)議的的網(wǎng)絡(luò)提供了良好的封裝,使用Socket對(duì)象來(lái)代表兩端的通信端口,并通過(guò)Socket產(chǎn)生IO流來(lái)進(jìn)行網(wǎng)絡(luò)通信。
    • Java為客戶端提供了Socket類,為服務(wù)器端提供了ServerSocket類。
  • 構(gòu)造方法

    方法名 說(shuō)明
    Socket(InetAddress address,int port) 創(chuàng)建流套接字并將其連接到指定IP指定端口號(hào)
    Socket(String host, int port) 創(chuàng)建流套接字并將其連接到指定主機(jī)上的指定端口號(hào)
  • 相關(guān)方法

    方法名 說(shuō)明
    InputStream getInputStream() 返回此套接字的輸入流
    OutputStream getOutputStream() 返回此套接字的輸出流
  • 示例代碼

    public class Client {
        public static void main(String[] args) throws IOException {
            //TCP協(xié)議,發(fā)送數(shù)據(jù)
    
            //1.創(chuàng)建Socket對(duì)象
            //細(xì)節(jié):在創(chuàng)建對(duì)象的同時(shí)會(huì)連接服務(wù)端
            //      如果連接不上,代碼會(huì)報(bào)錯(cuò)
            Socket socket = new Socket("127.0.0.1",10000);
    
            //2.可以從連接通道中獲取輸出流
            OutputStream os = socket.getOutputStream();
            //寫出數(shù)據(jù)
            os.write("aaa".getBytes());
    
            //3.釋放資源
            os.close();
            socket.close();
        }
    }
    

3.2TCP接收數(shù)據(jù)

  • 構(gòu)造方法

    方法名 說(shuō)明
    ServletSocket(int port) 創(chuàng)建綁定到指定端口的服務(wù)器套接字
  • 相關(guān)方法

    方法名 說(shuō)明
    Socket accept() 監(jiān)聽要連接到此的套接字并接受它
  • 注意事項(xiàng)

    1. accept方法是阻塞的,作用就是等待客戶端連接。
    2. 客戶端創(chuàng)建對(duì)象并連接服務(wù)器,此時(shí)是通過(guò)三次握手協(xié)議,保證跟服務(wù)器之間的連接。
    3. 針對(duì)客戶端來(lái)講,是往外寫的,所以是輸出流。
      針對(duì)服務(wù)器來(lái)講,是往里讀的,所以是輸入流。
    4. read方法也是阻塞的。
    5. 客戶端在關(guān)流的時(shí)候,還多了一個(gè)往服務(wù)器寫結(jié)束標(biāo)記的動(dòng)作。
    6. 最后一步斷開連接,通過(guò)四次揮手協(xié)議保證連接終止。
  • 三次握手和四次揮手

    • 三次握手

      從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之網(wǎng)絡(luò)編程(三十七),java基礎(chǔ),學(xué)習(xí),java,python,spring boot,開發(fā)語(yǔ)言,網(wǎng)絡(luò),spring cloud

    • 四次揮手

      從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之網(wǎng)絡(luò)編程(三十七),java基礎(chǔ),學(xué)習(xí),java,python,spring boot,開發(fā)語(yǔ)言,網(wǎng)絡(luò),spring cloud

  • 示例代碼

    public class Server {
        public static void main(String[] args) throws IOException {
            //TCP協(xié)議,接收數(shù)據(jù)
    
            //1.創(chuàng)建對(duì)象ServerSocker
            ServerSocket ss = new ServerSocket(10000);
    
            //2.監(jiān)聽客戶端的鏈接
            Socket socket = ss.accept();
    
            //3.從連接通道中獲取輸入流讀取數(shù)據(jù)
            InputStream is = socket.getInputStream();
            int b;
            while ((b = is.read()) != -1){
                System.out.println((char) b);
            }
    
            //4.釋放資源
            socket.close();
            ss.close();
        }
    }
    

3.3TCP程序練習(xí)(傳輸中文)

發(fā)送端:

public class Client {
    public static void main(String[] args) throws IOException {
        //TCP協(xié)議,發(fā)送數(shù)據(jù)

        //1.創(chuàng)建Socket對(duì)象
        //細(xì)節(jié):在創(chuàng)建對(duì)象的同時(shí)會(huì)連接服務(wù)端
        //      如果連接不上,代碼會(huì)報(bào)錯(cuò)
        Socket socket = new Socket("127.0.0.1",10000);


        //2.可以從連接通道中獲取輸出流
        OutputStream os = socket.getOutputStream();
        //寫出數(shù)據(jù)
        os.write("你好你好".getBytes());//12字節(jié)

        //3.釋放資源
        os.close();
        socket.close();

    }
}

接收端:

public class Server {
    public static void main(String[] args) throws IOException {
        //TCP協(xié)議,接收數(shù)據(jù)

        //1.創(chuàng)建對(duì)象ServerSocker
        ServerSocket ss = new ServerSocket(10000);

        //2.監(jiān)聽客戶端的鏈接
        Socket socket = ss.accept();

        //3.從連接通道中獲取輸入流讀取數(shù)據(jù)
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        // BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        int b;
        while ((b = br.read()) != -1){
            System.out.print((char) b);
        }

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

    }
}

后記
????????美好的一天,到此結(jié)束,下次繼續(xù)努力!欲知后續(xù),請(qǐng)看下回分解,寫作不易,感謝大家的支持??! ??????
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-713621.html

到了這里,關(guān)于從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之網(wǎng)絡(luò)編程(三十七)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包