TCP協議操作(基於本地局域網絡的一種網絡協議,可以進行數據的傳輸)


網絡編程基礎

軟件架構:

  • C/S架構:即Client/Server (客戶端/服務器端)架構. 吃配置

  • B/S架構:即Browser/Server(瀏覽器/服務器)架構 吃網絡

B/S和C/S架構的區別:

  • C/S架構基於局域網的,而B/S架構基於廣域網的基礎上

  • 硬件環境不同,C/S建立在專用網絡上,小范圍的網絡,可以專門的服務器提供數據連接和數據交換

  • C/S架一般面向的固定的用戶群體,對信息的安全控制較高一點.

  • 對程序架構不同:C/S架構大多建立在windows平台上,B/S建立在瀏覽上,不僅可以應用在windows平台上,也可以應用在Unix/Linux等平台上.

兩種架構各有優劣,但是無論使用哪種架構,都離不開服務器.離不開網絡的支持.網絡編程,就是在一定的協議下,實現兩台計算機通信的程序.

網絡通信協議
  • 網絡通信協議:通信協議是對計算機通信必須遵從的一種規則,協議中對數據的傳輸格式.傳輸的速率,傳輸的步驟等都做了統一的規定,通信雙方必須同時遵守最終實現的數據的正常傳輸和交換

  • TCP/IO:傳輸控制協議(TCP)/因特網互聯協議(IP),他們定義了計算機如何聯網.數據如何交換和傳輸的標准,它的內部包含了一系列用於處理數據通信的協議,並采用了4層的分層模型,每一層都呼叫下一層的所提供的協議來完成自己的請求.

協議分類

  • TCP協議:傳輸控制協議,該協議是面向連接的一種通信協議,即數據傳輸前在發送端和接收端先建立邏輯連接,然后再傳輸數據,它提供了多台計算機之間可靠的無差錯的數據傳輸.

    • 三次握手:在數據發送的准備階段,客戶端和服務器之間通過三次交互,保證連接的可靠性.

     

通過三次握手,建立連接后,客戶端和服務器端就可以進行數據傳輸了.由於這種面相連接的特性,TCP協議能夠數據傳輸的安全,所以應用挺廣泛的,下載文件等.

  • UDP:用戶數據報協議(Ucer DataProgram Protocal),他是面向無連接的協議.在進行數據傳輸時,不需要建立連接.不管對象在不在,直接將數據源封裝到一個數據包中發送過去,每次發送的數據不能很大.限制在幾十kb數據,數據傳輸時不安全,速度快.

網絡編程三要素

  • 協議:計算機通信的一種必需尊守的一種規則

  • IP地址:互聯網協議地址,俗稱IP,IP地址用來給網絡中的計算機編訂一個唯一的編號

  • 端口號:端口號就是唯一表示設備中的進程(應用程序).IP地址是唯一標識網絡中的設備.

  • 協議:計算機中網絡通信必須遵守的規則。
  • IP地址:互聯網協議地址(Internet Protocol Address) ,俗稱IP,給網絡中的計算機設備編訂一個唯一的編號,好比人的身份證號。

    IP地址分類:

    • IPv4:是一個32位的二進制數,通常被分為4個字節,表示形式:a.b.c.d ,例如:192.168.53.245 ,其中a.b.c.d都是一個0~255之間的十進制的整數,那么最多能夠表示42億個。

    • IPv6:為了擴大地址空間,通過IPv6重新定義地址空間,采用128位地址長度,每16個字節分為一組,分成8組十六進制數 ,表示形式:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,號稱互聯網中的任何一粒沙子能夠編寫進去,解決了地址不夠的問題。

     

通過DOS命名查看本機的IP地址:ipconfig

檢查網絡連接是否正常:ping ip地址

特殊的IP地址:

本機的IP地址:127.0.0.1 localhost 通過hosts文件,可以自定義自己的域名

  • 端口號:如何區分在網絡通信中打開的這些進程(應用程序)?通過端口號可以准確的找到彼此。

    • 端口號:用兩個字節表示的整數,它的取值范圍是0~65535。 其中,0~1023之間的的端口號被一些知名的應用和網絡服務占用了。普通的常規的應用程序只能使用從1024以上的端口號, 如果端口號被另外一個服務或者應用程序占用了,會導致當前程序啟動失敗。

    常用的端口號:

    Tomcat應用服務器:8080

    HTTP服務器:80 www.baidu.com:80 80端口可以選擇省略不寫

    數據庫服務器:MYSQL:3306 Oracle:1521

    TCP通信程序

    TCP通信能夠實現兩台計算機之間的數據交互,通信的兩端,要嚴格區分客戶端(Client)和服務器端(Server)。

    兩端通信的步驟:

    1.服務端首先需要啟動,等待客戶端的連接

    2.客戶端需要主動的連接服務器端,連接成功才能通信服務器端不可以主動連接客戶端。

    在Java當中,提供了兩個類用於實現TCP通信:

    • 客戶端:java.net.Socket類。創建Socke對象,向服務器端發送連接請求,服務端回應一個請求,兩者開始建立連接進行通信

    • 服務器端:java.new.ServerSocket類。創建ServerSocket對象,相當於開啟了一個服務,等待客戶端的連接。

    Socker類

    Socker類實現客戶端套接字,套接字指的是兩台設備之間通訊的端點。

    構造方法:

    public Socker(String host,int port): 創建套接字對象並將其連接到指定主機(服務器端)上的指定端口號,如果指定的host是null,則相當於指定地址為回送地址。

    備注:回送地址(123.x.x.x)是本機回送地址(loopback address),主要用於網絡軟件測試用的本機上的進程間的通信,無論什么程序,一旦使用回送地址發送數據,這個數據立即返回,不進行任何網絡傳輸數據。

    成員方法:

    • public InputStream getInputStream(): 獲取套接字的輸入流

    • public OutputStream getOutputStream(): 關閉此套接字

    • public void close(): 關閉此套接字

    • public void shutdownOutput(): 禁用此套接字的輸入流

      • 任何先前寫入的數據都將會被發送,隨后終止此輸出流。

    ServerSocket類

    ServerSocket類實現了服務器端套接字,該對象等待通過網絡的請求。

    構造方法

    public ServerSocket(int port): 使用該構造方法在創建ServerSocket對象時,就可以將其綁定到一個指定的端口號上,參數port就是端口號

    成員方法

    • public Socket accept(): 監聽並接受連接,返回一個新的Socket對象,用於

客戶端和服務器的制作栗子:

客戶端

 //1.創建一個Socket客戶端對象,構造方法中綁定服務器的ip地址和端口號.
        Socket socket = new Socket("192.168.53.244", 6666);
        //2.使用Socket對象中的方法getOutputStream獲取網絡字節輸出流對象
     //   OutputStream os = socket.getOutputStream();
       // 3.使用網絡字節輸出流對象中的方法write.給服務器發送數據.
      //  os.write("我好".getBytes());
       //4.使用Socket對象中的方法getInputStream()獲取網絡字節輸入流對象
        OutputStream is = socket.getOutputStream();
        //5.使用網絡字節輸入流對象調用read方法,讀取服務器會寫的數據
        FileInputStream fis = new FileInputStream("day31-Net\\b.gif");
        byte[] bytes = new byte[1024];
        int len=0;
        while ((len=fis.read(bytes))!=-1){
            is.write(bytes,0,len);
        }
        //有效字節個數
        //打印下服務器回傳的數據
        InputStream fi= socket.getInputStream();
        byte[] bytes1 = new byte[1024];
        int len1=0;
        while ((len1=fi.read(bytes1))!=-1){
            System.out.println(new String(bytes1,0,len1));
        }
        //釋放資源
        //os.close();
        socket.close();
    }

服務器

        // 1.創建ServerSocket服務器端對象和系統指定的端口號

        ServerSocket server = new ServerSocket(6666);
        //2.使用ServerSocket對象中的方法accept獲取客戶端請求的連接.拿到Socket對象
        Socket soket = server.accept();
        InputStream is = soket.getInputStream();
        OutputStream os = soket.getOutputStream();

            //    3.使用Socket對象中的方法getInputStream(),可以獲取網絡字節輸入流

            //    4.使用網絡字節輸入流對象中的方法read,讀取客戶端發送的數據
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len=is.read(bytes))!=-1){
                System.out.println(new String(bytes,0,len));
            }
            //打印接收客戶端發送的數據

            //    5.使用Socket對象中的方法getOutputStream(),獲取網絡字節輸出流對象

            //    6.使用網絡字節輸出流對象中的方法write,給客戶端回寫數據
            os.write("我知道了崽種".getBytes());
            //7.釋放資源
            server.close();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM