日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

重拾Java基础知识:网络编程

發(fā)布時間:2024/3/13 java 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重拾Java基础知识:网络编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

網(wǎng)絡編程

  • 前言
    • 網(wǎng)絡體系結(jié)構(gòu)
      • IP地址
        • IP地址分類
        • 子網(wǎng)掩碼
      • 端口
      • 域名
      • 網(wǎng)絡協(xié)議
        • TCP/IP協(xié)議
        • 三次握手與四次揮手
          • 為什么要三次握手?
          • 為什么要四次揮手?
        • UDP協(xié)議
        • HTTP協(xié)議
    • Socket網(wǎng)絡編程
      • TCP編程
        • InetAddress 類
        • Socket類
        • ServerSocket類
        • 案例一:客戶端向服務端發(fā)送消息,服務端收到消息后再發(fā)送給客戶端
        • 案例二:客戶端向服務端發(fā)送圖片,服務端收到消息后再發(fā)送圖片給客戶端
        • 案例三:客戶端和服務端通訊長連接
      • UDP編程
        • 案例一:發(fā)送方發(fā)送消息后,接收方接到消息
        • 案例二:發(fā)送方和接收方長連接
      • URL編程
        • 創(chuàng)建
        • 使用
        • 連接
        • 案例
    • 本章小結(jié)

前言

計算機網(wǎng)絡20世紀60年代出現(xiàn),進入21世紀后,計算機網(wǎng)絡已經(jīng)成為信息社會的基礎(chǔ)設(shè)施,深入到人類社會的方方面面,與人們的工作、學習和生活息息相關(guān)。計算機網(wǎng)絡通過傳輸介質(zhì)、通信設(shè)施和網(wǎng)絡通信協(xié)議,把分散在不同地點的計算機設(shè)備互連起來的,實現(xiàn)資源共享和數(shù)據(jù)傳輸?shù)南到y(tǒng)。

網(wǎng)絡編程就是編寫程序使互聯(lián)網(wǎng)的兩個(或多個)設(shè)備(如計算機)之間進行數(shù)據(jù)傳輸。Java語言對網(wǎng)絡編程提供了良好的支持。通過其提供的接口我們可以很方便地進行網(wǎng)絡編程。

網(wǎng)絡體系結(jié)構(gòu)

計算機網(wǎng)絡體系結(jié)構(gòu)是計算機網(wǎng)絡層次和協(xié)議的集合,網(wǎng)絡體系結(jié)構(gòu)對計算機網(wǎng)絡實現(xiàn)的功能,以及網(wǎng)絡協(xié)議、層次、接口和服務進行了描述,但并不涉及具體的實現(xiàn)。接口是同一節(jié)點內(nèi)相鄰層之間交換信息的連接處,也叫服務訪問點(SAP)。

IP地址

IP地址是IP協(xié)議提供的一種統(tǒng)一的地址格式,它為互聯(lián)網(wǎng)上的每一個網(wǎng)絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異。IP地址就像是我們的家庭住址一樣,如果你要寫信給一個人,你就要知道他(她)的地址,這樣郵遞員才能把信送到。

IP地址是一個32位的二進制數(shù),通常被分割為4個“8位二進制數(shù)”(也就是4個字節(jié))。IP地址通常用“點分十進制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進制整數(shù)。例:點分十進IP地址(100.4.5.6),實際上是32位二進制數(shù)(01100100.00000100.00000101.00000110)。

IP地址采用的IPv4格式,目前正在向IPv6過渡。IPv4采用32位地址長度,只有大約43億個地址,估計在2005~2010年間將被分配完畢,IPv4定義的有限地址空間將被耗盡,而地址空間的不足必將妨礙互聯(lián)網(wǎng)的進一步發(fā)展。而IPv6采用128位地址長度,幾乎可以不受限制地提供地址。按保守方法估算IPv6實際可分配的地址,整個地球的每平方米面積上仍可分配1000多個地址。在IPv6的設(shè)計過程中除解決了地址短缺問題以外,還考慮了在IPv4中解決不好的其它一些問題,主要有端到端IP連接、服務質(zhì)量(QoS)、安全性、多播、移動性、即插即用等。

IP地址分類

IP地址是由網(wǎng)絡號(net ID)與 主機號(host ID)兩部分組成的。根據(jù)不同的取值范圍,IP地址可以分為五類;

比如:192.168.1.2 掩碼255.255.255.0 。網(wǎng)絡位192.168.1 主機位是2

子網(wǎng)掩碼

子網(wǎng)掩碼(subnet mask)又叫網(wǎng)絡掩碼、地址掩碼、子網(wǎng)絡遮罩,它用來指明一個IP地址的哪些位標識的是主機所在的子網(wǎng),以及哪些位標識的是主機的位掩碼。子網(wǎng)掩碼不能單獨存在,它必須結(jié)合IP地址一起使用。

子網(wǎng)掩碼將A、B、C三類地址劃分為若干子網(wǎng),從而顯著提高了IP地址的分配效率,有效解決了IP地址資源緊張的局面。另一方面,在企業(yè)內(nèi)網(wǎng)中為了更好地管理網(wǎng)絡,網(wǎng)管人員也利用子網(wǎng)掩碼的作用,人為地將一個較大的企業(yè)內(nèi)部網(wǎng)絡劃分為更多個小規(guī)模的子網(wǎng),再利用三層交換機的路由功能實現(xiàn)子網(wǎng)互聯(lián),從而有效解決了網(wǎng)絡廣播風暴和網(wǎng)絡病毒等諸多網(wǎng)絡管理方面的問題。

子網(wǎng)掩碼機制提供了子網(wǎng)劃分的方法。其作用是:減少網(wǎng)絡上的通信量;節(jié)省IP地址;便于管理;解決物理網(wǎng)絡本身的某些問題。使用子網(wǎng)掩碼劃分子網(wǎng)后,子網(wǎng)內(nèi)可以通信,跨子網(wǎng)不能通信,子網(wǎng)間通信應該使用路由器,并正確配置靜態(tài)路由信息。劃分子網(wǎng),就應遵循子網(wǎng)劃分結(jié)構(gòu)的規(guī)則。就是用連續(xù)的1在IP地址中增加表示網(wǎng)絡地址,同時減少表示主機地址的位數(shù)。

比如利用子網(wǎng)數(shù)來計算:將B類IP:130.39.37.100劃分成27個子網(wǎng)。

  • 將27轉(zhuǎn)換成二進制:27=11011,位數(shù)為5位。
  • 將B類地址的子網(wǎng)掩碼255.255.0.0的主機地址前5位設(shè)為1,11111111.11111111.11111000.00000000得到255.255.248.0,這就是IP地址:130.39.37.100的子網(wǎng)掩碼。
  • 端口

    "端口"是英文port的意譯,可以認為是設(shè)備與外界通訊交流的出口。用兩個字節(jié)表示的整數(shù),它的取值范圍是0 - 65535。如果說IP地址可以唯一的標識網(wǎng)絡中的設(shè)備,那么端口號就可以唯一標識設(shè)備中的應用程序,也就是應用程序的標識。常見的端口號有:tomcat(8080)、mysql(3306)等。

    按照端口號的大小分類,可分為如下幾類:

    • 公認端口(WellKnownPorts):從0到1023,它們緊密綁定(binding)于一些服務。通常這些端口的通訊明確表明了某種服務的協(xié)議。例如:80端口實際上總是HTTP通訊。
    • 注冊端口(RegisteredPorts):從1024到49151。它們松散地綁定于一些服務。也就是說有許多服務綁定于這些端口,這些端口同樣用于許多其它目的。例如:許多系統(tǒng)處理動態(tài)端口從1024左右開始。
    • 動態(tài)和/或私有端口(Dynamicand/orPrivatePorts):從49152到65535。理論上,不應為服務分配這些端口。實際上,機器通常從1024起分配動態(tài)端口。但也有例外:SUN的RPC端口從32768開始。

    域名

    由于IP地址具有不方便記憶并且不能顯示地址組織的名稱和性質(zhì)等缺點,人們設(shè)計出了域名,并通過網(wǎng)域名稱系統(tǒng)(DNS,Domain Name System)來將域名和IP地址相互映射,使人更方便地訪問互聯(lián)網(wǎng),而不用去記住能夠被機器直接讀取的IP地址數(shù)串。

    從語法上講,每一個域名都是由標號序列組成,各標號之間用點隔開。如圖所示的域名,由3個標號組成,其中標號cn是頂級域名,標號com是二級域名,標號example是三級域名,www是主機名。

    在國家頂級域名下注冊的二級域名由各國自行確定。我國把二級域名劃分為類別域名行政域名2大類。
    類別域名:如ac(科研機構(gòu)),com(工、商、金融等企業(yè)),edu(中國教育機構(gòu)),gov(中國政府機構(gòu)),mil(中國國防機構(gòu)),net(提供互聯(lián)網(wǎng)絡服務的機構(gòu)),org(非營利性的組織)等
    行政區(qū)域名:共34個,適用于我國的各省、自治區(qū)、直轄市,如bj(北京市),js(江蘇省),sn(陜西省),sx(山西省)等。

    因特網(wǎng)的域名系統(tǒng)可以用域名樹來表示其結(jié)構(gòu),它實際上是一棵倒過來的樹,在最上面的是根,根下一級結(jié)點就是頂級域名,頂級域名可往下劃分二級域名,再往下劃分就是三級域名、四級域名。

    域名到IP地址的解析是由分布在因特網(wǎng)上的許多域名服務器共同完成的。當某一個應用進程需要把主機名解析為IP地址時,該應用進程就調(diào)用解析程序,并將待解析的域名放在DNS請求報文中,以DUP用戶數(shù)據(jù)報的方式發(fā)送給本地域名服務器,本地域名服務器再找到域名后,將對應的IP地址放在回答報文中返回,應用進程獲得目的主機的IP地址后即可進行通信。

    網(wǎng)絡協(xié)議

    計算機網(wǎng)絡中實現(xiàn)通信必須有一些約定,即通信協(xié)議,對速率、傳輸代碼、代碼結(jié)構(gòu)、傳輸控制步驟、出錯控制等制定標準。
    最常用的復合方式是層次方式,網(wǎng)絡通信的不同方面被分解為多個層,層與層之間用接口連接。通信的雙方具有相同的層次,層次實現(xiàn)的功能由協(xié)議數(shù)據(jù)單元(PDU)來描述。不同系統(tǒng)中的同一層構(gòu)成對等層,對等層之間通過對等層協(xié)議進行通信,理解批次定義好的規(guī)則和約定。每一層表示為物理硬件(即線纜和電流)與所傳輸信息之間的不同抽象層次。在理論上,每一層只與緊挨其上和其下的層對話。將網(wǎng)絡分層,這樣就可以修改甚至替換某一層的軟件,只要層與層之間的接口保持不變,就不會影響到其他層。

    • OSI協(xié)議

    開放式系統(tǒng)互聯(lián)通信參考模型(英語:Open System Interconnection Reference Model,縮寫為 OSI),簡稱為OSI模型(OSI model),一種概念模型,由國際標準化組織提出,一個試圖使各種計算機在世界范圍內(nèi)互連為網(wǎng)絡的標準框架。定義于ISO/IEC 7498-1。
    OSI模型把網(wǎng)絡通信的工作分為7層,分別是物理層、數(shù)據(jù)鏈路層、網(wǎng)絡層、傳輸層、會話層、表示層和應用層

    (1)物理層
    物理層處于OSI的最底層,是整個開放系統(tǒng)的基礎(chǔ)。物理層涉及通信信道上傳輸?shù)脑?strong>比特流(bits),它的功能主要是為數(shù)據(jù)端設(shè)備提供傳送數(shù)據(jù)的通路以及傳輸數(shù)據(jù)。
    (2)數(shù)據(jù)鏈路層
    數(shù)據(jù)鏈路層的主要任務是實現(xiàn)計算機網(wǎng)絡中相鄰節(jié)點之間的可靠傳輸,把原始的、有差錯的物理傳輸線加上數(shù)據(jù)鏈路協(xié)議以后,構(gòu)成邏輯上可靠的數(shù)據(jù)鏈路。需要完成的功能有鏈路管理、成幀、差錯控制以及流量控制等。其中成是對物理層的原始比特流進行界定,數(shù)據(jù)鏈路層也能夠?qū)?strong>幀的丟失進行處理。
    (3)網(wǎng)絡層
    網(wǎng)絡層涉及源主機節(jié)點到目的主機節(jié)點之間可靠的網(wǎng)絡傳輸,它需要完成的功能主要包括路由選擇、網(wǎng)絡尋址、流量控制、擁塞控制、網(wǎng)絡互連等
    (4)傳輸層
    傳輸層起著承上啟下的作用,涉及源端節(jié)點到目的端節(jié)點之間可靠的信息傳輸。傳輸層需要解決跨越網(wǎng)絡連接的建立和釋放,對底層不可靠的網(wǎng)絡,建立連接時需要三次握手,釋放連接時需要四次揮手。
    (5)會話層
    會話層的主要功能是負責應用程序之間建立、維持和中斷會話,同時也提供對設(shè)備和結(jié)點之間的會話控制,協(xié)調(diào)系統(tǒng)和服務之間的交流,并通過提供單工、半雙工和全雙工3種不同的通信方式,使系統(tǒng)和服務之間有序地進行通信。
    (6)表示層
    表示層關(guān)心所傳輸數(shù)據(jù)信息的格式定義,其主要功能是把應用層提供的信息變換為能夠共同理解的形式,提供字符代碼、數(shù)據(jù)格式、控制信息格式、加密等的統(tǒng)一表示。
    (7)應用層
    應用層為OSI的最高層,是直接為應用進程提供服務的。其作用是在實現(xiàn)多個系統(tǒng)應用進程相互通信的同時,完成一系列業(yè)務處理所需的服務。

    由于OSI參考模型過于龐大、復雜招致了許多批評。與此相對,美國國防部提出了TCP/IP協(xié)議棧參考模型,簡化了OSI參考模型,因為TCP/IP協(xié)議棧的簡單,獲得了廣泛的應用,并成為后續(xù)因特網(wǎng)使用的參考模型。

    • TCP/IP協(xié)議

    TCP/IP協(xié)議是一個開放的網(wǎng)絡協(xié)議簇,它的名字主要取自最重要的網(wǎng)絡層IP協(xié)議和傳輸層TCP協(xié)議。TCP/IP協(xié)議定義了電子設(shè)備如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉藴省?strong>TCP/IP參考模型采用4層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的協(xié)議來完成自己的需求,這4個層次分別是:網(wǎng)絡接口層、網(wǎng)絡層(IP層)、傳輸層(TCP層)、應用層。

    (1)網(wǎng)絡接口層
    這是TCP/IP軟件的最低層,負責接收IP數(shù)據(jù)報并通過網(wǎng)絡發(fā)送之,或者從網(wǎng)絡上接收物理幀,抽出IP數(shù)據(jù)報,交給IP層。
    (2)網(wǎng)絡層
    網(wǎng)絡層是整個TCP/IP協(xié)議棧的核心。它的功能是把分組發(fā)往目標網(wǎng)絡或主機。同時,為了盡快地發(fā)送分組,可能需要沿不同的路徑同時進行分組傳遞。因此,分組到達的順序和發(fā)送的順序可能不同,這就需要上層必須對分組進行排序。網(wǎng)絡層除了需要完成路由的功能外,也可以完成將不同類型的網(wǎng)絡(異構(gòu)網(wǎng))互連的任務。除此之外,互聯(lián)網(wǎng)層還需要完成擁塞控制的功能。
    (3)傳輸層
    負責在應用進程之間建立端到端的連接和可靠通信,它只存在與端節(jié)點中。涉及兩個協(xié)議,TCPUDP。其中,TCP協(xié)議提供面向連接的服務,提供按字節(jié)流的有序、可靠傳輸,可以實現(xiàn)連接管理、差錯控制、流量控制、擁塞控制等。UDP協(xié)議提供無連接的服務,用于不需要或無法實現(xiàn)面向連接的網(wǎng)絡應用中。
    (4)應用層
    為各種網(wǎng)絡應用提供服務。

    TCP/IP協(xié)議

    TCP/IP協(xié)議報文段包括協(xié)議首部和數(shù)據(jù)兩部分,協(xié)議首部的固定部分是20個字節(jié),首部的固定部分后面是選項部分。

    下面是報文段首部各個字段的含義:

  • 源端口號以及目的端口號:各占2個字節(jié),端口是傳輸層和應用層的服務接口,用于尋找發(fā)送端和接收端的進程,一般來講,通過端口號和IP地址,可以唯一確定一個TCP/IP連接,在網(wǎng)絡編程中,通常被稱為一個socket接口。

  • 序號:Seq序號,占4個字節(jié)、32位。用來標識從TCP/IP發(fā)送端向TCP/IP接收端發(fā)送的數(shù)據(jù)字節(jié)流。發(fā)起方發(fā)送數(shù)據(jù)時對此進行標記。

  • 確認序號:Ack序號,占4個字節(jié)、32位。包含發(fā)送確認的一端所期望收到的下一個序號。只有ACK標記位為1時,確認序號字段才有效,因此,確認序號應該是上次已經(jīng)成功收到數(shù)據(jù)字節(jié)序號加1,即Ack=Seq + 1

  • 數(shù)據(jù)偏移:占4個字節(jié),用于指出TCP/IP首部長度,若不存在選項,則這個值為20字節(jié),數(shù)據(jù)偏移的最大值為60字節(jié)。

  • 保留字段占6位,暫時可忽略,值全為0。

  • 標志位,6個
    (1)URG(緊急):為1時表明緊急指針字段有效
    (2)ACK(確認):為1時表明確認號字段有效
    (3)PSH(推送):為1時接收方應盡快將這個報文段交給應用層
    (4)RST(復位):為1時表明TCP連接出現(xiàn)故障必須重建連接
    (5)SYN(同步):在連接建立時用來同步序號
    (6)FIN(終止):為1時表明發(fā)送端數(shù)據(jù)發(fā)送完畢要求釋放連接

  • 接收窗口:占2個字節(jié),用于流量控制和擁塞控制,表示當前接收緩沖區(qū)的大小。在計算機網(wǎng)絡中,通常是用接收方的接收能力的大小來控制發(fā)送方的數(shù)據(jù)發(fā)送量。TCP/IP連接的一端根據(jù)緩沖區(qū)大小確定自己的接收窗口值,告訴對方,使對方可以確定發(fā)送數(shù)據(jù)的字節(jié)數(shù)。

  • 校驗和:占2個字節(jié),范圍包括首部和數(shù)據(jù)兩部分。

  • 選項是可選的,默認情況是不選。

  • 三次握手與四次揮手

    TCP/IP是面向連接的協(xié)議,因此每個TCP/IP連接都有3個階段:連接建立、數(shù)據(jù)傳送和連接釋放。連接建立經(jīng)歷三個步驟,通常稱為“三次握手”。三次握手的目的是同步連接雙方的序列號和確認號并交換 TCP/IP窗口大小信息。

  • 第一次握手
  • 客戶端發(fā)送連接請求。發(fā)送連接請求報文段內(nèi)容:SYN=1,seq=x;SYN=1意思是一個TCP的SYN(同步序列)標志位置為1的包,指明客戶端打算連接的服務器的端口;seq=x表示客戶端初始序號x,保存在包頭的序列號(Sequence Number)字段里,進入SYN—SEND狀態(tài),等待服務器的確認。

  • 第二次握手
  • 服務器收到客戶端連接請求報文,如果同意建立連接,向客戶機發(fā)回確認報文段(ACK)應答,并為該TCP連接分配TCP緩存和變量。服務器發(fā)回確認報文段內(nèi)容:SYN=1,ACK=1,seq=y,ack=x+1;SYN標志位和ACK標志位均為1,同時將確認序號(Acknowledgement Number)設(shè)置為客戶的初始序列號 ( Initial Sequence Number) ISN 加1,即x+1;seq=y為服務端初始序號y。服務器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一并發(fā)送給客戶端,此時服務器進入SYN—RECV狀態(tài)。

  • 第三次握手
  • 客戶機收到服務器的確認報文段后,向服務器給出確認報文段(ACK),并且也要給該連接分配緩存和變量。此包發(fā)送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。客戶端發(fā)回確認報文段內(nèi)容:ACK=1,seq=x+1,ack=y+1;ACK=1為確認報文段;seq=x+1為客戶端序號加1;ack=y+1,為服務器發(fā)來的ACK的初始序號字段+1。

    為什么要三次握手?
    • TCP/IPUDP的區(qū)別

    我們先來對比下TCP/IPUDP的區(qū)別:我們都知道TCP/IP是可靠通信協(xié)議, 而 UDP 是不可靠通信協(xié)議,所以UDP會導致接收方接收到的數(shù)據(jù)可能存在部分丟失。

    • 為什么不是兩次握手

    TCP/IP是一個雙向通信協(xié)議, 通信雙方都有能力發(fā)送信息, 并接收響應。

    (1)防止舊的重復連接引起連接混亂

    如果 TCP/IP 握手的次數(shù)只有兩次,接收方只能選擇接受請求或者拒絕接受請求,在網(wǎng)絡狀況比較復雜或者網(wǎng)絡狀況比較差的情況下,發(fā)送方可能會連續(xù)發(fā)送多次建立連接的請求,某個網(wǎng)絡結(jié)點長時間的滯留了,在某個時間節(jié)點到達服務端,此時就有可能任務是服務端發(fā)起的新請求,向客戶端發(fā)生確認報文,建立連接,導致錯誤的連接。所以如果 TCP/IP 是三次握手的話,那么客戶端在接收到服務器端 SEQ+1 的消息之后,就可以判斷當前的連接是否為歷史連接,如果判斷為歷史連接的話就會發(fā)送終止報文(RST)給服務器端終止連接,否則就會發(fā)送指令給服務器端來建立連接。

    (2)同步初始化序列化

    通過上面的概念我們知道 TCP/IP的一個重要特征就是可靠性,而 TCP/IP為了保證在不穩(wěn)定的網(wǎng)絡環(huán)境中構(gòu)建一個穩(wěn)定的數(shù)據(jù)連接,它就需要一個“序列號”字段來保證自己的穩(wěn)定性,而這個序列號的作用就是防止數(shù)據(jù)包重復發(fā)送,以及有效的解決數(shù)據(jù)包接收時順序顛倒的問題。客戶端和服務端通過三次握手建立連接后,得到一個可靠的初始化序列號。如果只是兩次握手, 最多只有連接發(fā)起方的起始序列號能被確認, 另一方選擇的序列號則得不到確認。

    • 為什么不是四次或更多次握手

    當服務端收到客戶端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。所以沒有必要將SYNACK單獨分開,避免資源浪費,三次握手是建立雙方連接的最低值。

    當客戶端和服務器通過三次握手建立了TCP連接以后,就可以進行數(shù)據(jù)傳輸,當數(shù)據(jù)傳送完畢,就要進行關(guān)閉操作,需要經(jīng)歷四個步驟。

    由于TCP連接是全雙工的,因此每個方向都必須單獨進行關(guān)閉。這原則是當一方完成它的數(shù)據(jù)發(fā)送任務后就能發(fā)送一個FIN來終止這個方向的連接。收到一個FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù)。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方執(zhí)行被動關(guān)閉。

  • 第一次揮手
  • TCP客戶端發(fā)送一個FIN,用來關(guān)閉客戶端到服務端的數(shù)據(jù)傳送,客戶端進入FIN-WAIT-1狀態(tài),表示客戶端沒有數(shù)據(jù)要發(fā)送給服務端了。

  • 第二次揮手
  • 服務端收到這個FIN,它發(fā)回一個ACK給客戶端,確認序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號;服務端進入CLOSE-WAIT狀態(tài),服務端告訴客戶端,我“同意”你的關(guān)閉請求。

  • 第三次揮手
  • 服務端向客戶端發(fā)送FIN報文段,請求關(guān)閉連接,服務端進入LAST-ACK狀態(tài)。

  • 第四次揮手
  • 客戶端收到FIN后,客戶端進入TIME-WAIT狀態(tài),接著發(fā)回一個ACK報文給服務端確認,并將確認序號設(shè)置為收到序號加1,服務端進入CLOSED狀態(tài),客戶端等待2MSL后依然沒有收到回復,則證明服務端已正常關(guān)閉,客戶端也可以關(guān)閉連接了,完成四次揮手。

    為什么要四次揮手?

    關(guān)閉連接時,客戶端向服務端發(fā)送 FIN 時,僅僅表示客戶端不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù)。服務器收到客戶端的 FIN 報文時,先回一個 ACK 應答報文,而服務端可能還有數(shù)據(jù)需要處理和發(fā)送,等服務端不再發(fā)送數(shù)據(jù)時,才發(fā)送 FIN 報文給客戶端來表示同意現(xiàn)在關(guān)閉連接。

    • 可以進行三次揮手嗎?

    可以的,我們知道第三次揮手是為了確認服務端沒有要發(fā)送的數(shù)據(jù),如果第一次揮手后服務端沒有數(shù)據(jù)要發(fā)送,是有可能將第二次和第三次揮手合并的,這樣就是三次揮手了。如果服務端有數(shù)據(jù),難道就不能進行三次揮手了嗎?也是不一定的,TCP中有個延遲確認的特性,客戶端收到數(shù)據(jù)后,可以不用馬上進行ACK確認,可能將多個數(shù)據(jù)包合并一個確認包,再將確認包放到第四次揮手里,然后把第二次和第三次揮手合并,這樣也就是三次揮手了。

    UDP協(xié)議

    UDPUser Datagram Protocol的簡稱, 中文名是用戶數(shù)據(jù)報協(xié)議,是OSIOpen System Interconnection,開放式系統(tǒng)互聯(lián)) 參考模型中一種無連接的傳輸層協(xié)議。傳輸數(shù)據(jù)之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡上。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應用程序生成數(shù)據(jù)的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。

    • 由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺服務機可同時向多個客戶機傳輸相同的消息。
    • UDP信息包的標題很短,只有8個字節(jié),相對于TCP的20個字節(jié)信息包而言UDP的額外開銷很小。
    • 吞吐量不受擁擠控制算法的調(diào)節(jié),只受應用軟件生成數(shù)據(jù)的速率、傳輸帶寬、源端和終端主機性能的限制。
    • UDP是面向報文的。發(fā)送方的UDP對應用程序交下來的報文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報文的邊界,因此,應用程序需要選擇合適的報文大小。

    雖然UDP是一個不可靠的協(xié)議,但它是分發(fā)信息的一個理想?yún)f(xié)議。例如,在屏幕上報告股票市場、顯示航空信息等等。UDP也用在路由信息協(xié)議RIP(Routing Information Protocol)中修改路由表。在這些應用場合下,如果有一個消息丟失,在幾秒之后另一個新的消息就會替換它。UDP廣泛用在多媒體應用中。

    HTTP協(xié)議

    超文本傳輸協(xié)議(Hyper Text Transfer Protocol,HTTP)是一個簡單的請求-響應協(xié)議,HTTP是應用層協(xié)議,它通常運行在TCP之上。它指定了客戶端可能發(fā)送給服務器什么樣的消息以及得到什么樣的響應。請求和響應消息的頭以ASCII形式給出;而 消息內(nèi)容則具有一個類似MIME的格式。這個簡單模型是早期Web成功的有功之臣,因為它使開發(fā)和部署非常地直截了當。

    典型的HTTP事務處理有如下的過程:

    • 默認情況下,客戶端在端口80打開與服務器的一個TCP連接,URL中還可以指定其他端口。
    • 客戶端向服務器發(fā)送消息,請求指定路徑上的資源。這個資源包括一個首部,可選地(取決于請求的性質(zhì))還可以有一個空行,后面是這個請求的數(shù)據(jù)。
    • 服務器向客戶端發(fā)送響應。響應以響應碼開頭,后面是包含數(shù)據(jù)的首部、一個空行以及所請求的文檔或錯誤消息。
    • 客戶端和服務器關(guān)閉連接。

    HTTP報文由從客戶機到服務器的請求和從服務器到客戶機的響應構(gòu)成。請求報文格式如下:

    • 請求報文

    HTTP請求報文由請求行、首部行實體主體組成。

    • 響應報文

    HTTP響應報文由狀態(tài)行、首部行實體主體組成。

    除了上面案例中的POST請求方法,還有很多其它請求方法,如圖所示:

    HTTP響應報文的例子中,我們可以看到狀態(tài)碼是200,表示響應成功。

    HTTP之外還有HTTPS

    HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單來說就是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細內(nèi)容就需要SSL。它是一個URL scheme(抽象標識符體系),句法類同http:體系,用于安全的HTTP數(shù)據(jù)傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默認端口及一個加密/身份驗證層(在HTTPTCP之間)。

    HTTPHTTPS的區(qū)別:

    超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務器之間傳遞信息。HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協(xié)議不適合傳輸一些敏感信息,比如信用開號、密碼等。

    為了解決HTTP協(xié)議的這一缺陷,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS。為了數(shù)據(jù)傳輸?shù)陌踩?#xff0c;HTTPSHTTP的基礎(chǔ)上加入了SSL協(xié)議,SSL依靠證書來驗證服務器的身份,并為瀏覽器和服務器之間的通信加密。

    HTTPSHTTP的區(qū)別主要為以下四點:

    • https協(xié)議需要到ca申請證書,一般免費證書很少,需要繳費。
    • http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
    • http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
    • http的連接很簡單,是無狀態(tài)的;https協(xié)議是有ssl+http協(xié)議構(gòu)建的可進行加密傳輸、身份認證的網(wǎng)絡協(xié)議,比http協(xié)議安全。

    Socket網(wǎng)絡編程

    Java的網(wǎng)絡編程主要涉及到的內(nèi)容是套接字(Socket)編程。Socket是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡通信的基本操作單元。它是網(wǎng)絡通信過程中端點的抽象表示,包含進行網(wǎng)絡通信必須的五種信息:連接使用的協(xié)議、本地主機的IP地址、本地進程的協(xié)議端口、遠程主機的IP地址、遠程進程的協(xié)議端口。Socket本身不算是協(xié)議,它只是提供了一個針對TCP或者UDP編程的接口。Socket是對端口通信開發(fā)的工具,它要更底層一些。

    Socket編程主要涉及到客戶端和服務端兩個方面,首先是在服務器端創(chuàng)建一個服務器套接字(ServerSocket),并把它附加到一個端口上,服務器從這個端口監(jiān)聽連接。端口號的范圍是0到65536,但是0到1024是為特權(quán)服務保留的端口號,我們可以選擇任意一個當前沒有被其他進程使用的端口。

    客戶端請求與服務器進行連接的時候,根據(jù)服務器的域名或者IP地址,加上端口號,打開一個套接字。當服務器接受連接后,服務器和客戶端之間的通信就像輸入輸出流一樣進行操作。

    TCP編程

    java.net.IntAddress類封裝計算機的IP地址,沒有端口。java.net.Socket 類代表一個套接字,而且 java.net.ServerSocket 類為服務器程序提供了一種機制來監(jiān)聽客戶端并和它們建立連接。

    InetAddress 類

    InetAddress類的兩個子類:Inet4AddressInet6Address,一個用于表示IPV4協(xié)議,另一個表示IPV6協(xié)議

    InetAddress類不能直接創(chuàng)建,通過靜態(tài)方法創(chuàng)建對象。列舉常用方法:

    • getByName(String host):通過主機名或域名得到InetAddress對象
    • getLocalHost():獲取本地主機的地址。
    • getLoopbackAddress():獲取IPV4或者IPV6回環(huán)對象。
    • getAllByName(String host):獲取指定主機名的所有IP地址的數(shù)組。

    示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) {InetAddress inetAddress = InetAddress.getByName("localhost");System.out.println(inetAddress);inetAddress = InetAddress.getLocalHost();System.out.println(inetAddress);inetAddress = InetAddress.getLoopbackAddress();System.out.println(inetAddress);InetAddress[]inetAddress2 = InetAddress.getAllByName("www.baidu.com");System.out.println(Arrays.toString(inetAddress2));/** Output: * localhost/127.0.0.1* DESKTOP-4K4SA9I/192.168.36.118* localhost/127.0.0.1* [www.baidu.com/180.101.49.12, www.baidu.com/180.101.49.11]*/} }

    創(chuàng)建后,還有許多方法可以進行獲取和判斷操作,列舉一部分代碼,示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) {InetAddress inetAddress = InetAddress.getByName("www.baidu.com");System.out.println("規(guī)范的主機名:"+inetAddress.getCanonicalHostName());System.out.println("主機名:"+inetAddress.getHostName());System.out.println("是否為通配符地址:"+inetAddress.isAnyLocalAddress());System.out.println("是否為鏈接本地地址:"+inetAddress.isLinkLocalAddress());System.out.println("是否全局范圍的多播地址:"+inetAddress.isMCGlobal());System.out.println("是否鏈路本地作用域的多播地址:"+inetAddress.isMCLinkLocal());System.out.println("是否為一個IP組播地址:"+inetAddress.isMulticastAddress());System.out.println("地址是否可達:"+inetAddress.isReachable(1000));System.out.println("是否為網(wǎng)站本地地址:"+inetAddress.isSiteLocalAddress());/** Output:* 規(guī)范的主機名:180.101.49.12* 主機名:www.baidu.com* 是否為通配符地址:false* 是否為鏈接本地地址:false* 是否全局范圍的多播地址:false* 是否鏈路本地作用域的多播地址:false* 是否為一個IP組播地址:false* 地址是否可達:true* 是否為網(wǎng)站本地地址:false*/} }

    除此之外還有IntetSocketAddress類,與InetAddress 類不同的是增加了端口號(port),創(chuàng)建方法如下:

    • createUnresolved(String host, int port):未解析的套接字地址 。
    • new InetSocketAddress(int port):創(chuàng)建一個套接字地址,其中IP地址是通配符地址和指定值的端口號。
    • new InetSocketAddress(String hostname, int port):使用主機名和端口號創(chuàng)建套接字地址。
    • new InetSocketAddress(InetAddress addr, int port):使用InetAddress對象和端口號創(chuàng)建套接字地址。

    示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) {InetSocketAddress inetSocketAddress = InetSocketAddress.createUnresolved("localhost",8088);System.out.println(inetSocketAddress);inetSocketAddress = new InetSocketAddress(8088);System.out.println(inetSocketAddress);inetSocketAddress = new InetSocketAddress("192.168.16.118",8088);System.out.println(inetSocketAddress);InetAddress inetAddress = InetAddress.getByName("192.168.16.118");inetSocketAddress = new InetSocketAddress(inetAddress,8088);System.out.println(inetSocketAddress);/** Output:* localhost:8088* 0.0.0.0/0.0.0.0:8088* /192.168.16.118:8088* /192.168.16.118:8088*/} }

    當然IntetSocketAddress類也有屬于自己的方法,示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) {InetSocketAddress inetSocketAddress = new InetSocketAddress("www.baidu.com",8088);System.out.println("解析地址:"+inetSocketAddress.getAddress());System.out.println("主機名:"+inetSocketAddress.getHostName());System.out.println("端口號:"+inetSocketAddress.getPort());System.out.println("主機名或地址:"+inetSocketAddress.getHostString());System.out.println("是否解析:"+inetSocketAddress.isUnresolved());/** Output:* 解析地址:www.baidu.com/180.101.49.12* 主機名:www.baidu.com* 端口號:8088* 主機名或地址:www.baidu.com* 是否解析:false*/} }

    Socket類

    Socket是一組編程接口(API), 是對TCP/IP協(xié)議的封裝和應用。java.net.Socket 類方法代表客戶端和服務器都用來互相通信的套接字。客戶端通過實例化而擁有一個 Socket 對象,然后服務器從 accept() 方法的返回值獲得一個 Socket 對象。

    通過創(chuàng)建Socket 類可以監(jiān)聽指定端口,列舉常用的構(gòu)造函數(shù),示例代碼如下:

    • new Socket():創(chuàng)建一個未連接的套接字。使用 connect() 方法來連接這個套接字到服務器。
    • new Socket(String host, int port):創(chuàng)建一個流套接字并將其連接到指定的主機和端口號。
    • new Socket(InetAddress address, int port):創(chuàng)建一個流套接字并將其連接到指定的端口和指定的IP地址。
    • new Socket(String host, int port, InetAddress localAddr,int localPort):創(chuàng)建套接字并將其連接到上指定的遠程主機指定的遠端端口。Socket也將bind()綁定到本地提供的地址和端口。
    public class Client {public static void main(String[] args) {Socket socket = new Socket();socket = new Socket("localhost",3306);socket = new Socket(InetAddress.getLocalHost(),3306);socket = new Socket(InetAddress.getByName("www.baidu.com"),443,InetAddress.getLocalHost(),9966);} }

    Socket類中還有一些比較常用的方法,示例代碼如下:

    public class Client {public static void main(String[] args) {Socket socket = new Socket("localhost",3306);System.out.println("nio通道對象:"+socket.getChannel());System.out.println("是否啟用:"+socket.getKeepAlive());System.out.println("本地端口:"+socket.getLocalPort());System.out.println("遠程端口:"+socket.getPort());System.out.println("連接地址:"+socket.getInetAddress());System.out.println("本地地址:"+socket.getLocalAddress());System.out.println("遠程地址:"+socket.getRemoteSocketAddress());System.out.println("輸入流:"+socket.getInputStream());System.out.println("輸出流:"+socket.getOutputStream());System.out.println("是否連接成功:"+socket.isConnected());System.out.println("是否綁定成功:"+socket.isBound());System.out.println("是否關(guān)閉:"+socket.isClosed());System.out.println("讀取是否關(guān)閉:"+socket.isInputShutdown());System.out.println("寫入是否關(guān)閉:"+socket.isOutputShutdown());SocketAddress socketAddress = Proxy.NO_PROXY.address();//連接socket.connect(socketAddress);//綁定socket.bind(socketAddress);//關(guān)閉socket.close();//設(shè)置socket是否激活socket.setKeepAlive(true);//設(shè)置網(wǎng)絡緩沖區(qū)大小socket.setSendBufferSize(1024);/** Output:* nio通道對象:null* 是否啟用:false* 本地端口:58154* 遠程端口:3306* 連接地址:localhost/127.0.0.1* 本地地址:/127.0.0.1* 遠程地址:localhost/127.0.0.1:3306* 輸入流:java.net.SocketInputStream@29453f44* 輸出流:java.net.SocketOutputStream@5cad8086* 是否連接成功:true* 是否綁定成功:true* 是否關(guān)閉:false* 讀取是否關(guān)閉:false* 寫入是否關(guān)閉:false*/} }

    ServerSocket類

    僅僅只有Socket類是不足以編寫服務器的,java.net.ServerSocket 類被服務器應用程序使用來獲得一個端口和監(jiān)聽客戶端請求。ServerSocket使用accept()方法監(jiān)聽這個端口的入站連接。accept()會一直阻塞,直到一個客戶端嘗試建立連接,此時accept()將會返回一個連接客戶端和服務器的Socket對象。

    列舉常用的構(gòu)造函數(shù),示例代碼如下:

    • new ServerSocket():創(chuàng)建未綁定的服務器套接字。
    • new ServerSocket(int port):創(chuàng)建與指定端口綁定的服務器套接字。
    • new ServerSocket(int port, int backlog):創(chuàng)建服務器套接字并將其綁定到指定的本地端口,設(shè)置請求的傳入連接隊列的最大長度。
    • new ServerSocket(int port, int backlog, InetAddress bindAddr):創(chuàng)建一個具有指定端口的服務器,設(shè)置請求的傳入連接隊列的最大長度以及綁定的本地IP地址。
    public class Client {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket();serverSocket = new ServerSocket(80);serverSocket = new ServerSocket(80,5);serverSocket = new ServerSocket(80,5,InetAddress.getByName("www.baidu.com"));} }

    ServerSocket類中還有一些比較常用的方法,示例代碼如下:

    public class Client {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(80);System.out.println("nio通道對象:"+serverSocket.getChannel());System.out.println("本地端口:"+serverSocket.getLocalPort());System.out.println("連接地址:"+serverSocket.getInetAddress());System.out.println("是否綁定成功:"+serverSocket.isBound());System.out.println("是否關(guān)閉:"+serverSocket.isClosed());//連接serverSocket.accept();//綁定serverSocket.bind(Proxy.NO_PROXY.address());//關(guān)閉serverSocket.close();/** Output:* nio通道對象:null* 本地端口:80* 連接地址:0.0.0.0/0.0.0.0* 是否綁定成功:true* 是否關(guān)閉:false*/} }

    案例一:客戶端向服務端發(fā)送消息,服務端收到消息后再發(fā)送給客戶端

    客戶端,示例代碼如下:

    public class Client {public static void main(String[] args) throws IOException {try(Socket socket = new Socket("192.168.36.118", 996);OutputStream outputStream = socket.getOutputStream();InputStream inputStream = socket.getInputStream();){System.out.println("客戶端發(fā)送消息:");outputStream.write("你好".getBytes());//關(guān)鍵代碼:告訴服務端結(jié)束輸出,否則服務端收到消息會一直阻塞socket.shutdownOutput();//outputStream.flush();byte[] bytes = new byte[1024];int len = 0;while ((len = inputStream.read(bytes)) != -1) {System.out.println("客戶端接收消息:" + new String(bytes, 0, len));}}catch (Exception e){}/** Output:* 客戶端發(fā)送消息:* 客戶端接收消息:你好,很高興認識你*/} }

    服務端,示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {try(ServerSocket serverSocket = new ServerSocket(996);Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();) {byte[] bytes = new byte[1024];int len = 0;while ((len = inputStream.read(bytes)) != -1) {System.out.println("服務端接收消息:" + new String(bytes, 0, len));}System.out.println("服務端發(fā)送消息");outputStream.write("你好,很高興認識你".getBytes());}catch (Exception e){e.printStackTrace();}/** Output:* 服務端接收消息:你好* 服務端發(fā)送消息*/} }

    案例二:客戶端向服務端發(fā)送圖片,服務端收到消息后再發(fā)送圖片給客戶端

    基本原理和發(fā)送消息一直,只不過把內(nèi)容的主題換成了文件。

    客戶端,示例代碼如下:

    public class Client {public static void main(String[] args) throws IOException {byte[] bytes = new byte[1024];int len = 0;try (Socket socket = new Socket("192.168.36.118", 996);OutputStream outputStream = socket.getOutputStream();InputStream inputStream = socket.getInputStream();FileInputStream fileInputStream = new FileInputStream("C:\\mnt\\client.gif");FileOutputStream fileOutputStream = new FileOutputStream("client\\server.jpg");) {System.out.println("客戶端發(fā)送圖片");while ((len = fileInputStream.read(bytes)) != -1) {outputStream.write(bytes, 0, len);}//關(guān)鍵代碼:告訴服務端結(jié)束輸出,否則服務端會一直阻塞socket.shutdownOutput();//outputStream.flush();System.out.println("收到服務端圖片并保存");while ((len = inputStream.read(bytes)) != -1) {fileOutputStream.write(bytes, 0, len);}} catch (Exception e) {}/** Output:* 客戶端發(fā)送圖片* 收到服務端圖片并保存*/} }

    服務端,示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {byte[] bytes = new byte[1024];int len = 0;try(ServerSocket serverSocket = new ServerSocket(996);Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();FileInputStream fileInputStream = new FileInputStream("C:\\mnt\\server.jpg");FileOutputStream fileOutputStream = new FileOutputStream("server\\client.gif");) {System.out.println("收到客戶端圖片并保存");while ((len = inputStream.read(bytes)) != -1) {fileOutputStream.write(bytes,0,len);}System.out.println("服務端發(fā)送圖片");while ((len = fileInputStream.read(bytes)) != -1) {outputStream.write(bytes,0,len);}}catch (Exception e){e.printStackTrace();}/** Output:* 收到客戶端圖片并保存* 服務端發(fā)送圖片*/} }

    結(jié)果圖如下:

    案例三:客戶端和服務端通訊長連接

    先來展示錯誤的長連接方式。

    客戶端,示例代碼如下:

    public class Client {public static void main(String[] args) throws IOException {try(Socket socket = new Socket("192.168.131.1", 996);OutputStream outputStream = socket.getOutputStream();InputStream inputStream = socket.getInputStream();){while (true) {System.out.println("客戶端發(fā)送消息:");Scanner scanner = new Scanner(System.in);String b = scanner.next();outputStream.write(b.getBytes());//關(guān)鍵代碼:告訴服務端結(jié)束輸出,否則服務端收到消息會一直阻塞socket.shutdownOutput();//outputStream.flush();byte[] bytes = new byte[1024];int len = 0;while ((len = inputStream.read(bytes)) != -1) {System.out.println("客戶端接收消息:" + new String(bytes, 0, len));}}}catch (Exception e){e.printStackTrace();}/** Output:* 客戶端發(fā)送消息:* 11* 客戶端接收消息:222* 客戶端接收消息:222* 客戶端接收消息:qwe* 客戶端接收消息:qwe* 客戶端接收消息:qwe* 客戶端接收消息:qwe* 客戶端接收消息:qwe*/} }

    服務端,示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {try(ServerSocket serverSocket = new ServerSocket(996);Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();) {while (true) {byte[] bytes = new byte[1024];int len = 0;while ((len = inputStream.read(bytes)) != -1) {System.out.println("服務端接收消息:" + new String(bytes, 0, len));}System.out.println("服務端發(fā)送消息");Scanner scanner = new Scanner(System.in);String b = scanner.next();outputStream.write(b.getBytes());}}catch (Exception e){e.printStackTrace();}/** Output:* 服務端接收消息:11* 服務端發(fā)送消息* 222* 服務端發(fā)送消息* 222* 服務端發(fā)送消息*/} }

    通過輸出可以看到,當客戶端第一次發(fā)送消息后,服務端接收完消息,再由服務端發(fā)送時,由于沒有關(guān)閉輸出操作,導致客戶端一直處于監(jiān)聽狀態(tài),但是如果服務端關(guān)閉輸出操作;客戶端再發(fā)送消息時,此時雙方發(fā)送都已關(guān)閉,這會導致異常錯誤。我們想要實現(xiàn)雙方都可以發(fā)送或接受消息,示例代碼如下:

    客戶端,示例代碼如下:

    public class Client {private static Executor executor = Executors.newCachedThreadPool();public static void main(String[] args) throws IOException {executor.execute(new Runnable() {@Overridepublic void run() {try (Socket socket = new Socket("192.168.131.1", 996);InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();) {while (true) {System.out.println("客戶端發(fā)送消息:");Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();outputStream.write(s.getBytes());//強制刷新輸出outputStream.flush();byte[] bytes = new byte[1024];int len = inputStream.read(bytes);s = new String(bytes, 0, len);System.out.println("客戶端接收消息:" + s);}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});/** Output:* 客戶端發(fā)送消息:* 你好,很高興認識你!* 客戶端接收消息:我也是,怎么稱呼你?*/} }

    服務端,示例代碼如下:

    public class NetworkProgramming {private static Executor executor = Executors.newCachedThreadPool();public static void main(String[] args) throws IOException {executor.execute(new Runnable() {@Overridepublic void run() {try (ServerSocket serverSocket = new ServerSocket(996);Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();) {while (true) {byte[] bytes = new byte[1024];int len = 0;while ((len = inputStream.read(bytes)) != -1) {String s = new String(bytes, 0, len);System.out.println("服務端接收消息:" + s);System.out.println("服務端發(fā)送消息:");Scanner scanner = new Scanner(System.in);s = scanner.nextLine();outputStream.write(s.getBytes());//強制刷新輸出outputStream.flush();}}} catch (Exception e) {e.printStackTrace();}}});/** Output:* 服務端接收消息:你好,很高興認識你!* 服務端發(fā)送消息:* 我也是,怎么稱呼你?*/} }

    這樣就實現(xiàn)了一個簡單的聊天工具,不過單方面通訊不能發(fā)送多條信息,算是一個小遺憾,有機會再研究,有想法的可以評論區(qū)討論!!!

    UDP編程

    UDP編程主要有兩個類:DatagramSocket類和DatagramPacket類,UDP數(shù)據(jù)報通過數(shù)據(jù)報套接字 DatagramSocket 發(fā)送和接收,系統(tǒng)不保證UDP數(shù)據(jù)報一定能夠安全送到目的地,也不能確定什么時候可以抵達。DatagramPacket 對象封裝了UDP數(shù)據(jù)報,在數(shù)據(jù)報中包含了發(fā)送端的 IP 地址和端口號以及接收端的IP地址和端口號。UDP協(xié)議中每個數(shù)據(jù)報都給出了完整的地址信息,因此無須建立發(fā)送方接收方的連接。這里不在介紹每個類的創(chuàng)建方式和方法了,有興趣的可以自己去了解。

    案例一:發(fā)送方發(fā)送消息后,接收方接到消息

    發(fā)送方,示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {try (DatagramSocket datagramSocket = new DatagramSocket();) {String str = "第一次發(fā)送數(shù)據(jù)";DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("localhost"), 996);datagramSocket.send(datagramPacket);}} }

    接收方,示例代碼如下:

    public class Client {public static void main(String[] args) throws IOException {try (DatagramSocket datagramSocket = new DatagramSocket(996);) {byte[] bytes = new byte[1024];//數(shù)據(jù)報包DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 996);datagramSocket.receive(datagramPacket);System.out.println("接收方接收數(shù)據(jù):" + new String(bytes));}/** Output:* 接收方接收數(shù)據(jù):第一次發(fā)送數(shù)據(jù)*/} }

    案例二:發(fā)送方和接收方長連接

    發(fā)送方,示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {//new DatagramSocket(996);監(jiān)聽接收端口try (DatagramSocket datagramSocket = new DatagramSocket(997);) {while (true) {System.out.print("發(fā)送方發(fā)送數(shù)據(jù):");String str = new Scanner(System.in).nextLine();DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("localhost"), 996);datagramSocket.send(datagramPacket);byte[] bytes = new byte[1024];//數(shù)據(jù)報包datagramPacket = new DatagramPacket(bytes, bytes.length);datagramSocket.receive(datagramPacket);System.out.println("發(fā)送方接收數(shù)據(jù):" + new String(bytes));}} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}/** Output:* 發(fā)送方發(fā)送數(shù)據(jù):你好,很高興認識你!* 發(fā)送方接收數(shù)據(jù):我也是,要不出來見個面把。* 發(fā)送方發(fā)送數(shù)據(jù):嗯嗯*/} }

    接收方,示例代碼如下:

    public class Client {public static void main(String[] args) throws IOException {//new DatagramSocket(996);監(jiān)聽接收端口try (DatagramSocket datagramSocket = new DatagramSocket(996);) {while (true) {byte[] bytes = new byte[1024];//數(shù)據(jù)報包DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);datagramSocket.receive(datagramPacket);System.out.println("接收方接收數(shù)據(jù):" + new String(bytes));System.out.print("接收方發(fā)送數(shù)據(jù):");String str = new Scanner(System.in).nextLine();datagramPacket = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("localhost"), 997);datagramSocket.send(datagramPacket);}} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}/** Output:* 接收方接收數(shù)據(jù):你好,很高興認識你!* 接收方發(fā)送數(shù)據(jù):我也是,要不出來見個面把。* 接收方接收數(shù)據(jù):嗯嗯*/} }

    經(jīng)過TCP/IPUDP代碼的代碼實戰(zhàn),很容易發(fā)現(xiàn)它們之間的區(qū)別:TCP/IP建立一個端口就可以實現(xiàn)客戶端和服務端之間的交互,而UDP不同,發(fā)送方和接收發(fā)實際上是兩個不同的端口,只不過擔當同一個角色的兩個不同的操作,TCP/IP就有點類似于同一個角色同一個操作。

    URL編程

    URLUniform Resource Locator)中文名為統(tǒng)一資源定位符,有時也被俗稱為網(wǎng)頁地址。表示為互聯(lián)網(wǎng)上的資源,如網(wǎng)頁或者 FTP 地址。

    創(chuàng)建

    在java.net包中定義了URL類,該類用來處理有關(guān)URL的內(nèi)容。

    public class NetworkProgramming {public static void main(String[] args) throws IOException {URL url = new URL("https","baike.baidu.com",80,"/item/Java/85979?fr=aladdin#5");URL url = new URL("https","baike.baidu.com","/item/Java/85979?fr=aladdin#5");URL url = new URL(new URL("https://baike.baidu.com"),"/item/Java/85979?fr=aladdin#5");URL url = new URL("https://baike.baidu.com/item/Java/85979?fr=aladdin#5");} }

    一共有四種創(chuàng)建方式,以第一種創(chuàng)建方式為例:第一個參數(shù)表示協(xié)議、第二個參數(shù)表示主機、第三個參數(shù)表示端口、第四個參數(shù)表示文件地址

    使用

    URL類中包含了很多方法用于訪問URL的各個部分:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {URL url = new URL("https://baike.baidu.com/item/Java/85979?fr=aladdin#5");System.out.println("url內(nèi)容:" + url.getContent());System.out.println("url授權(quán)部分:" + url.getAuthority());System.out.println("url默認端口:" + url.getDefaultPort());System.out.println("url文件信息::" + url.getFile());System.out.println("url主機:" + url.getHost());System.out.println("url端口號:" + url.getPort());System.out.println("url協(xié)議:" + url.getProtocol());System.out.println("url參數(shù):" + url.getQuery());System.out.println("url錨鏈接:" + url.getRef());System.out.println("url路徑:" + url.getPath());/** Output:* url內(nèi)容:sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@66d2e7d9* url授權(quán)部分:baike.baidu.com* url默認端口:443* url文件信息::/item/Java/85979?fr=aladdin* url主機:baike.baidu.com* url端口號:-1* url協(xié)議:https* url參數(shù):fr=aladdin* url錨鏈接:5* url路徑:/item/Java/85979*/} }

    連接

    當你知道一個地址后,如果你需要使用它,就得先連接上:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {URL url = new URL("https://baike.baidu.com/item/Java/85979?fr=aladdin#5");URLConnection urlConnection = url.openConnection();} }

    連接成功后,可以獲取頁面的一些信息,下面列舉了比較常用的方法:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {URL url = new URL("https://baike.baidu.com/item/Java/85979?fr=aladdin#5");URLConnection urlConnection = url.openConnection();//設(shè)置地址可用于讀取urlConnection.setDoInput(true);//設(shè)置地址可用于輸出urlConnection.setDoOutput(true);//設(shè)置連接超時時間urlConnection.setConnectTimeout(1000);//設(shè)置讀取超時時間urlConnection.setReadTimeout(1000);System.out.println("獲取讀取狀態(tài):"+urlConnection.getDoInput());System.out.println("獲取輸出狀態(tài):"+urlConnection.getDoOutput());System.out.println("獲取連接狀態(tài):"+urlConnection.getConnectTimeout());System.out.println("獲取讀取超時時間:"+urlConnection.getReadTimeout());System.out.println("獲取報文頭(header)內(nèi)容長度:"+urlConnection.getContentLength());System.out.println("獲取報文頭(header)類型:"+urlConnection.getContentType());System.out.println("獲取報文頭(header)編碼格式:"+urlConnection.getContentEncoding());//輸入流urlConnection.getInputStream();//輸出流urlConnection.getOutputStream();/** Output:* 獲取讀取狀態(tài):true* 獲取輸出狀態(tài):true* 獲取連接狀態(tài):1000* 獲取讀取超時時間:1000* 獲取報文頭(header)內(nèi)容長度:-1* 獲取報文頭(header)類型:text/html; charset=UTF-8* 獲取報文頭(header)編碼格式:null*/} }

    案例

    下面就介紹通過URL獲取某網(wǎng)站經(jīng)典歌曲《兩只老虎》為例,示例代碼如下:

    public class NetworkProgramming {public static void main(String[] args) throws IOException {URL url = new URL("http://music.163.com/song/media/outer/url?id=566443167.mp3");URLConnection urlConnection = url.openConnection();try (InputStream inputStream = urlConnection.getInputStream();FileOutputStream fileOutputStream = new FileOutputStream("兩只老虎.mp3");) {byte[] bytes = new byte[1024];int i = 0;while ((i = inputStream.read(bytes)) != -1) {fileOutputStream.write(bytes);}} catch (Exception e) {e.printStackTrace();}} }

    運行后,可以看到對應的項目工作空間下多了一個文件夾

    本章小結(jié)

    網(wǎng)絡編程從大的方面說就是對信息的發(fā)送到接收,中間傳輸為物理線路的作用。網(wǎng)絡編程設(shè)計的內(nèi)容也是非常的廣,一起加油。

    總結(jié)

    以上是生活随笔為你收集整理的重拾Java基础知识:网络编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日韩免费中文 | 在线视频日韩一区 | 国产丝袜一区二区三区 | 91精品免费在线 | 欧美日韩精品久久久 | 天堂久色 | 韩国av一区二区 | 一区 二区电影免费在线观看 | 国产成人精品一区二三区 | 伊人伊成久久人综合网站 | 亚洲免费在线播放视频 | www四虎影院 | 一级成人免费视频 | 中文在线中文a | 9色在线视频| 2018亚洲男人天堂 | 久久久www | 人人盈棋牌| 视频福利在线观看 | 日韩精品免费一线在线观看 | 视频在线观看入口黄最新永久免费国产 | 国产麻豆精品免费视频 | 亚洲乱码久久 | 欧美午夜寂寞影院 | 欧美日韩观看 | 一区二区精品国产 | 久久小视频 | 97热视频| 婷婷精品在线视频 | 在线观看香蕉视频 | 免费久久网 | 99久久婷婷国产一区二区三区 | 国产精品免费一区二区 | 激情综合网五月 | 欧美色图另类 | 国产精品麻豆果冻传媒在线播放 | 精品久久久久_ | 91视频免费视频 | 日韩在线观看视频一区二区三区 | 欧美va在线观看 | 久热色超碰 | 一区二区毛片 | 国产精品18久久久久久久久久久久 | 国产精品麻豆视频 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 91黄在线看 | 国产午夜精品一区二区三区在线观看 | 免费看三级黄色片 | 夜夜躁狠狠躁 | 日本特黄一级 | 久久激情综合网 | 国产精品自在线 | 久久久久国产一区二区三区四区 | 伊人久久一区 | 日本一区二区三区免费观看 | 日韩精品一区不卡 | 黄色亚洲免费 | 精品在线二区 | 国产精品自拍在线 | 国产视频一区二区在线观看 | 国产欧美综合视频 | 欧美激情综合五月色丁香小说 | 日韩一级精品 | 丝袜美腿一区 | 日韩高清免费在线观看 | 五月天激情视频在线观看 | av电影在线观看 | 婷婷激情5月天 | 欧美久久久久久久久久 | 黄色av免费 | 国产精品18久久久久久久久 | 久久久久国产精品免费网站 | 深爱激情开心 | 在线看v片成人 | 成 人 a v天堂 | 国产精品久久久久久久久久尿 | av在线免费在线 | 日本免费久久高清视频 | 亚洲春色综合另类校园电影 | 激情中文在线 | 国产美女精品视频 | 黄色成人免费电影 | 好看的国产精品视频 | 久久亚洲影视 | 射九九 | 欧美一区二区在线看 | 久久综合毛片 | 91精品国产欧美一区二区成人 | 91毛片在线 | 欧美国产日韩激情 | 黄色成人影视 | 精品99久久久久久 | 国产成人777777 | 夜色资源站wwwcom | 色婷婷视频在线观看 | 91久草视频 | 成人一级片视频 | 福利视频入口 | 免费一级日韩欧美性大片 | 99精品国产高清在线观看 | 天天草天天摸 | 久久综合给合久久狠狠色 | 日日干夜夜爱 | 久久久久久久99精品免费观看 | 91麻豆精品 | www.香蕉视频| 不卡电影一区二区三区 | 在线播放国产一区二区三区 | 天天干天天操人体 | 九九热在线视频免费观看 | 日韩一区二区三区免费视频 | 精品99视频 | 草免费视频 | 狠狠色婷婷丁香六月 | 一区二区三区在线观看免费视频 | 福利网址在线观看 | 麻豆精品在线视频 | 亚洲激情网站免费观看 | 99久久久国产精品免费99 | 国产精品第二十页 | 黄色aaa级片 | 亚州精品在线视频 | 亚洲精品h| 波多野结衣一区三区 | 色国产精品| 久久久91精品国产 | 在线 日韩 av | 高潮毛片无遮挡高清免费 | 能在线看的av | av手机版| av中文在线播放 | 国产va在线 | 日韩精品一区二区免费视频 | avsex| adn—256中文在线观看 | 久草视频在线新免费 | 中文字幕免费高清在线 | av中文字幕在线观看网站 | av片免费播放 | 国产精品日韩在线 | 亚洲 中文 欧美 日韩vr 在线 | 日三级在线 | 久久艹欧美 | 免费国产视频 | 操少妇视频 | 成人av在线影视 | 国产高清不卡在线 | 五月的婷婷 | 又黄又爽又湿又无遮挡的在线视频 | 天天综合操| 99综合电影在线视频 | 国产精品不卡在线播放 | 欧美日韩免费在线视频 | 国产中文字幕久久 | 18pao国产成视频永久免费 | 国产精品久久久久久久久费观看 | 91插插视频 | 911av视频| 综合av在线 | 久久99热这里只有精品 | 经典三级一区 | 欧美日韩视频一区二区三区 | 免费手机黄色网址 | 夜夜操综合网 | 久久久久久久久久影院 | 国产99久久久国产精品成人免费 | 日韩伦理片一区二区三区 | 国产精品成人免费一区久久羞羞 | 亚洲成人国产精品 | 国产做爰视频 | 成人a在线观看 | 欧美精品国产综合久久 | 久久久在线观看 | 日韩激情av在线 | 91av在线视频播放 | 毛片网站在线观看 | 国产 日韩 欧美 中文 在线播放 | 天天摸天天弄 | 999久久久久久久久 69av视频在线观看 | 免费中文字幕视频 | 国产一级电影网 | 中文字幕在线观看2018 | 久久人人添人人爽添人人88v | 91精品国产欧美一区二区 | 成人久久精品 | 九九免费在线视频 | 中文字幕日韩高清 | 国产精品免费小视频 | 成人黄色毛片视频 | 91最新网址| 在线精品一区二区 | 中文字幕a∨在线乱码免费看 | 国产精品理论片在线观看 | 久久国产免费视频 | 在线亚洲天堂网 | 91久久精品日日躁夜夜躁国产 | 日韩免费福利 | 91人人视频在线观看 | av片在线观看免费 | 日本一区二区免费在线观看 | 欧美一区二区三区在线播放 | 国产在线播放一区二区 | 91精品国自产在线 | 国产伦理一区二区三区 | 久久久久国产精品免费 | 2021国产在线视频 | 免费久久99精品国产 | 久久在线影院 | 欧美精品二区 | 婷婷激情av | 爱爱av在线 | 日本xxxxav| 97热在线观看 | 亚洲精品理论片 | av高清一区 | 1000部18岁以下禁看视频 | 欧美一区二区三区免费看 | 国产国语在线 | 国产一区二区在线观看视频 | 成年一级片 | 91九色最新 | 亚洲资源在线观看 | av字幕在线 | 久草免费色站 | 玖玖玖国产精品 | 美女网站色免费 | 91视频3p | 黄色毛片在线观看 | 亚洲视频一区二区三区在线观看 | 久久久久亚洲精品中文字幕 | 91色一区二区三区 | 免费在线观看污网站 | 免费看污片 | 五月婷婷视频在线 | 婷婷九月丁香 | 九九久久国产 | 日韩欧美视频在线播放 | av中文字幕在线播放 | 一区二区三区韩国免费中文网站 | 国产中文欧美日韩在线 | 亚洲在线日韩 | 热久久视久久精品18亚洲精品 | www好男人| 国产精品久久久网站 | 国产精品精品久久久久久 | 夜夜嗨av色一区二区不卡 | 中文字幕欧美激情 | 少妇精品久久久一区二区免费 | 欧美一区二区精品在线 | www色婷婷com| 精品一区二区免费 | 日韩黄色在线电影 | 国产香蕉97碰碰碰视频在线观看 | 婷婷久久综合九色综合 | 国产午夜一区二区 | 男女视频国产 | 久久高清免费视频 | 黄色小网站在线 | 在线小视频你懂得 | 免费观看一级 | 亚洲精品国产精品国 | 伊人成人久久 | 99精品欧美一区二区 | 日韩乱色精品一区二区 | 国产精品免费视频网站 | 成人午夜免费福利 | 成人黄色电影在线观看 | 国产一级视频在线免费观看 | 人人藻人人澡人人爽 | 91在线影院 | 欧美色图狠狠干 | 日韩理论电影在线 | 欧美日韩精品电影 | 成人 亚洲 欧美 | 欧美色图另类 | 在线精品亚洲一区二区 | 国产在线a | 色噜噜狠狠狠狠色综合 | 国产精品igao视频网入口 | 四虎国产精品免费 | 超碰97国产在线 | 99色婷婷| 色综合久久88色综合天天 | 亚洲免费视频在线观看 | 91在线看| 97精品国产97久久久久久春色 | 丁香五月网久久综合 | 欧美一级视频一区 | 玖玖999 | 久草免费电影 | 亚洲精品视频免费在线观看 | 亚洲人片在线观看 | 亚洲精品a区 | 色a资源在线 | 福利视频区 | 亚洲婷婷在线视频 | 免费手机黄色网址 | 午夜影视一区 | 三级黄色免费片 | 免费黄色网址大全 | 国产黄色特级片 | 91久久影院 | www99久久| 久章草在线观看 | 欧美日韩在线看 | wwxxxx日本 | 国产无遮挡又黄又爽馒头漫画 | 精品电影一区 | 成人免费网站视频 | 五月婷婷伊人网 | 国产精品久久二区 | 在线日本看片免费人成视久网 | www.91成人 | av福利在线播放 | 欧美黄色成人 | 久久麻豆精品 | 99麻豆久久久国产精品免费 | 久久久久久久电影 | 欧美日韩91 | 精品一区二区三区久久久 | 日韩首页 | 超级av在线| 伊在线视频 | 久久精品一区二区国产 | 日韩在线在线 | 国产黄色精品网站 | 久久精品99北条麻妃 | 亚洲一二三区精品 | 最近中文字幕在线中文高清版 | 天天干天天射天天插 | 在线天堂亚洲 | 午夜精品一区二区三区视频免费看 | 国产日产精品一区二区三区四区的观看方式 | 国产精品情侣视频 | 久艹在线观看视频 | 网站在线观看你们懂的 | 一级黄色大片在线观看 | 国产粉嫩在线 | 在线亚洲精品 | 99综合视频 | 在线国产一区 | 精品国产一区二区三区免费 | 免费a视频 | 亚州av网站 | 在线观看播放av | 久久久久久高潮国产精品视 | 手机看片 | 狠狠干我 | 97成人精品视频在线播放 | 国产美女视频一区 | 中文字幕中文字幕中文字幕 | 国产免费区 | 成人av中文字幕 | 国产视频在线观看一区 | 国产日韩精品在线观看 | 久久艹在线观看 | 免费手机黄色网址 | 在线观看的黄色 | 精品久久久久久久久久久久久久久久久久 | 国产黄色片免费看 | 亚洲视频久久久 | 黄网站www| 高潮毛片无遮挡高清免费 | 国产小视频你懂的在线 | 高清不卡毛片 | 中文字幕免费在线看 | 婷婷综合五月天 | 国产一线二线三线在线观看 | 色网站黄 | 中文字幕久久精品一区 | www.97视频| 激情视频免费在线 | 蜜臀av夜夜澡人人爽人人桃色 | 六月丁香婷婷网 | 国产日韩在线播放 | av一本久道久久波多野结衣 | 婷婷香蕉 | 久久久久久国产精品亚洲78 | 亚洲一区视频免费观看 | free. 性欧美.com | www.com.黄| av色综合| 成人羞羞视频在线观看免费 | 国产视频亚洲视频 | 国产成人在线观看 | 最近高清中文字幕 | 97在线视频免费 | 久久免费在线观看视频 | 91热爆在线观看 | 日韩电影一区二区三区 | 亚洲精品自在在线观看 | 精品av在线播放 | 丁香婷五月 | 免费在线观看国产精品 | 人人澡人人添人人爽一区二区 | 天天操天天操天天操天天 | 午夜婷婷在线观看 | 五月婷婷六月丁香 | 日本中文字幕影院 | 在线天堂视频 | 麻豆91在线看 | 波多野结衣小视频 | 精品国产亚洲一区二区麻豆 | 色婷婷亚洲 | www.超碰| 久久免费看片 | 婷婷视频 | 久久久精品国产一区二区 | 97在线观看免费高清 | 欧美日韩裸体免费视频 | 日韩av线观看 | 成人全视频免费观看在线看 | 9热精品 | 亚洲性少妇性猛交wwww乱大交 | 精品国产乱码 | 在线观看免费日韩 | 一区二区三区四区精品视频 | 深夜福利视频在线观看 | 亚洲精品视频偷拍 | 免费精品人在线二线三线 | 欧美日韩后 | 91网站观看| 99视频免费看 | 日韩免费播放 | 夜夜躁狠狠躁日日躁 | 99久热在线精品 | 在线免费观看涩涩 | 91一区二区三区久久久久国产乱 | 91粉色视频 | 久久久蜜桃 | 在线观看精品国产 | 日韩一级片大全 | 91av欧美 | 亚洲va欧美va人人爽春色影视 | 欧美精品一区二区蜜臀亚洲 | 国产一区二区在线观看视频 | 国产精品原创 | 国产精品日韩在线播放 | 天天爱天天操天天射 | 国产一级一片免费播放放 | 夜夜夜夜操 | 国产精品福利久久久 | 国产一级精品绿帽视频 | 欧美日韩一区三区 | 亚洲男男gⅴgay双龙 | 在线中文字幕av观看 | 国产成本人视频在线观看 | 麻豆成人小视频 | 高清在线一区 | 婷婷色网址 | 国产精品久久久久久久久蜜臀 | 成人黄色小说在线观看 | 成人黄色视 | 91新人在线观看 | 黄色网在线播放 | 天天天天综合 | 国产经典av| 综合伊人av | 亚洲精品一区二区三区四区高清 | 亚洲成人av在线播放 | 欧美日在线观看 | 国产精品久久久久久影院 | 超碰在线日韩 | 一区二区伦理 | 国产一二区精品 | 亚洲午夜电影网 | 天天夜夜亚洲 | 亚洲精品视频一二三 | 天天射天天操天天干 | 在线影视 一区 二区 三区 | 99精品久久精品一区二区 | 久久免费电影网 | 欧美日韩中 | 国产这里只有精品 | 久久精品视频99 | 久久色视频| 久久99精品国产99久久6尤 | 色综合狠狠干 | 摸bbb搡bbb搡bbbb | 国产成人精品一区二 | 日本中文字幕在线一区 | 综合久久久久久久久 | 五月婷婷激情五月 | 亚洲国产精品传媒在线观看 | 四虎影视精品永久在线观看 | 日韩欧美视频 | 久久色中文字幕 | 久久伦理电影网 | 国产亚洲aⅴaaaaaa毛片 | 一区二区三区动漫 | 成年人在线观看网站 | 激情中文在线 | 日韩三区在线观看 | 九九热在线视频 | 亚洲爱视频 | 亚洲欧洲精品在线 | 人人超在线公开视频 | 在线观看视频黄色 | 天天干天天干天天干天天干天天干天天干 | 成人黄大片视频在线观看 | 日韩高清二区 | 久久久九色精品国产一区二区三区 | 久久人人爽av | 亚洲最新av网站 | 国产精品美女www爽爽爽视频 | 国产精品九九视频 | av线上看 | 99看视频在线观看 | 久久五月婷婷丁香社区 | 国产91小视频 | 黄色软件在线观看免费 | 国产1级毛片 | 少妇18xxxx性xxxx片 | 在线免费观看视频a | 福利一区二区三区四区 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 国产午夜精品视频 | 国产经典av| 国产精品久久久久久久久久久久午夜 | 久草在线观看资源 | 96精品视频 | 99色资源| 中文字幕在线观看一区二区 | 婷婷丁香av| 久久久久久久久久久久久久电影 | 这里只有精品视频在线观看 | 欧美精品xxx | 福利电影久久 | 久久久av电影| 精品视频免费久久久看 | 四虎永久网站 | 91九色综合 | 久久九九久久九九 | 亚洲精品一区二区精华 | 中文字幕在线免费看线人 | 在线国产91 | 91成人免费看 | 欧美地下肉体性派对 | 国产精品一区一区三区 | 日韩在线电影一区 | 久久成人精品视频 | 五月婷婷在线视频观看 | 免费福利在线视频 | 日韩精品视频网站 | 91免费网站在线观看 | 在线观看免费91 | 黄色大片免费网站 | 人人干人人超 | 婷婷亚洲综合 | 久热这里有精品 | 丁香婷婷综合激情五月色 | 国产视频2021| 欧美激情亚洲综合 | 亚洲,播放| 国产午夜精品一区二区三区欧美 | 亚洲精品久久久久中文字幕二区 | 久久久wwww| 五月天久久久久久 | 亚洲国产精品一区二区久久hs | 国产小视频在线免费观看视频 | 黄色免费高清视频 | 日韩av手机在线看 | 亚洲午夜精品电影 | 天天干天天操天天爱 | 综合天天网 | 国产精品麻豆果冻传媒在线播放 | 一区二区毛片 | 国产一区二区三区免费视频 | 精品在线观看国产 | 成人网在线免费视频 | 少妇精品久久久一区二区免费 | 免费电影播放 | 中文字幕免费高 | 国产精彩视频 | 91视频久久久久久 | 四虎永久国产精品 | 五月婷婷在线观看视频 | 欧美日韩一区二区三区视频 | 中文字幕欧美三区 | 国产第一页精品 | 久久久午夜影院 | 久久久久97国产 | 成人黄色大片网站 | 中文字幕日韩有码 | 美女久久久 | 中文视频在线 | 成年人电影毛片 | 国产大片免费久久 | 99热在线这里只有精品 | 中文字幕第一页在线vr | 操操操人人 | 99情趣网视频 | 狠狠夜夜| 日韩久久精品一区二区三区 | 成人免费毛片aaaaaa片 | 久久久免费网站 | 美女网站色免费 | 国产成人精品999 | 国产精品v欧美精品 | 美女av免费看| 欧美日韩18 | www.夜夜草| 亚洲国产精品激情在线观看 | 欧美资源在线观看 | 91精品国 | 日韩av在线高清 | 久久久久久黄 | 伊人天天狠天天添日日拍 | 久久国精品 | 精品国产精品一区二区夜夜嗨 | 国产手机视频 | 婷婷丁香导航 | 啪啪免费观看网站 | 五月丁香 | 黄色片视频在线观看 | 亚洲最新av网址 | 国产视频 久久久 | 一级国产视频 | 69国产在线观看 | 最近的中文字幕大全免费版 | 国产不卡一| 国产视频中文字幕 | 美女av免费| 国产精品成久久久久 | 久久久国产一区 | 国产97色在线 | 操操操夜夜操 | 免费黄色在线网站 | 日本乱视频 | 二区视频在线 | 97激情影院 | 国产一区二区三区高清播放 | 在线播放日韩av | 婷婷在线精品视频 | 99视频在线观看免费 | 狠狠综合久久 | 国产黄色大全 | 国产夫妻av在线 | 伊人五月天婷婷 | 狠狠色香婷婷久久亚洲精品 | 久草视频在| 中文字幕一区二区三区乱码不卡 | av无限看 | 在线视频1卡二卡三卡 | 亚洲电影影音先锋 | 国产一区精品在线 | 久久久久久美女 | 欧美一区二区日韩一区二区 | 欧美日韩xxxxx | 在线观看亚洲a | 欧美精品国产综合久久 | 97人人澡人人添人人爽超碰 | 欧美性爽爽| 久久精品久久久久 | 天天玩天天干天天操 | 午夜久草| 狠狠躁夜夜av | 国产精品999久久久 久产久精国产品 | 欧美一区二区精品在线 | 国模视频一区二区 | 亚洲人在线 | 日韩欧美一区二区在线观看 | 天天色天天射天天综合网 | 日韩电影在线一区二区 | 欧美日韩视频精品 | 亚洲视频久久久 | 五月天激情视频在线观看 | 国产色视频一区 | 日韩在线电影观看 | 国产精品va | 高清美女视频 | 久久精品成人热国产成 | 日日夜夜艹 | 久久久国产高清 | 国产人免费人成免费视频 | 国产中文字幕国产 | 国产女人18毛片水真多18精品 | 97**国产露脸精品国产 | 婷婷色亚洲 | 欧美日韩一区久久 | 91免费日韩 | 免费网站在线观看成人 | 国产破处精品 | 最近中文字幕视频网 | 午夜色婷婷 | 日韩一区精品 | 96亚洲精品久久久蜜桃 | 91日韩精品| 国产又粗又猛又黄 | 日韩欧美69 | 日韩欧美电影在线 | 欧美精品v国产精品 | aaa日本高清在线播放免费观看 | 亚洲精品国产日韩 | 国产在线观 | 蜜臀av网址| 久久久久久久久久久免费 | 中文字幕日韩伦理 | 久久久国际精品 | 1024久久| 99精品国产一区二区三区麻豆 | 久爱综合| 麻豆视频在线 | 免费高清男女打扑克视频 | 国产玖玖精品视频 | 日本久久成人中文字幕电影 | 狠狠干夜夜操 | 亚洲免费在线视频 | 精品国产乱码久久 | 97电影在线 | 美女免费视频一区 | 色网站视频 | 国产成人久久精品一区二区三区 | 99精品视频在线免费观看 | 色综合婷婷久久 | 久久免费成人网 | 亚洲精品在线视频观看 | 五月天激情综合 | 久久亚洲婷婷 | 国产97视频在线 | 亚洲自拍偷拍色图 | 91丨精品丨蝌蚪丨白丝jk | 夜夜骑天天操 | 国产精品国产毛片 | 精品国模一区二区 | 中文字幕日韩高清 | 狠狠躁天天躁 | 亚洲国产精品日韩 | 国产一区二区在线影院 | 国产伦精品一区二区三区… | 韩日电影在线观看 | 久久99国产精品免费网站 | 天天射天天| 天天干天天摸天天操 | 手机在线免费av | 人人插人人看 | 免费精品国产va自在自线 | 又爽又黄在线观看 | 99视频在线精品 | 日韩簧片在线观看 | 国产粉嫩在线观看 | 亚洲精品乱码久久久久久高潮 | 日韩欧美一级二级 | 中文字幕在线观看你懂的 | 91麻豆.com| 91大神精品视频在线观看 | 九九一级片 | 欧美日韩亚洲国产一区 | 五月婷婷开心中文字幕 | 久久精品免费播放 | 在线日韩视频 | 日韩美女高潮 | 欧美精品久 | 国内精品免费久久影院 | 日日爽| 白丝av在线 | 午夜精品视频一区 | 久福利| 欧美a级片网站 | 日韩69av | 97精产国品一二三产区在线 | 国产亚洲午夜高清国产拍精品 | 色偷偷人人澡久久超碰69 | 激情av资源 | 一区二区三区精品久久久 | 青青色影院 | 欧美一二三专区 | 精品国内自产拍在线观看视频 | 国产特级毛片 | 国产一区二区在线观看视频 | 国产视频在线一区二区 | 婷婷国产v亚洲v欧美久久 | 就操操久久| 在线观看免费视频 | 欧美激情视频一区 | 久久精品在线免费观看 | 91在线永久 | 久久老司机精品视频 | 97综合网| 在线导航av | 97超视频在线观看 | 中文字幕电影高清在线观看 | av网站免费线看精品 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 成人免费xxxxxx视频 | 国产无套一区二区三区久久 | 午夜av不卡 | 99国产情侣在线播放 | 国产精品毛片一区 | 在线不卡中文字幕播放 | 91麻豆看国产在线紧急地址 | 国产乱对白刺激视频在线观看女王 | 久草亚洲视频 | 国产最新视频在线观看 | 国产黄a三级三级三级三级三级 | 国产午夜精品一区二区三区欧美 | 丁香婷婷在线观看 | 亚洲欧美日韩中文在线 | 一区二区精品 | av动态图片 | 日本性动态图 | 久久怡红院 | 韩国在线视频一区 | 精品国自产在线观看 | 欧美日韩精品二区第二页 | 97av在线视频 | 玖玖在线精品 | 91精品蜜桃 | 日本丰满少妇免费一区 | 久久精品老司机 | 视频在线一区 | 99九九视频| 四虎海外影库www4hu | 日韩免费av在线 | 综合久久网 | 国产一级免费电影 | 奇米网777 | 国产精品久久久久999 | 91爱看片| av在线电影网站 | 国产精品自产拍在线观看蜜 | 国产精品久久久久久久免费大片 | 国产日韩精品一区二区 | 天天草综合网 | 国产中的精品av小宝探花 | 五月色丁香 | 日韩精品在线视频免费观看 | 久久免费精品视频 | 亚洲黄色免费观看 | 色偷偷888欧美精品久久久 | 亚洲欧美偷拍另类 | 99久久久久久久 | 99久久久国产免费 | 九九综合久久 | 精品理论片 | 69视频国产 | 天天操操操操操 | 日本三级香港三级人妇99 | 911香蕉视频 | av女优中文字幕在线观看 | 欧美做受xxx| 国产日韩av在线 | 超碰av在线免费观看 | 欧美精品久久人人躁人人爽 | 久久桃花网 | 97超碰影视 | 99视频在线观看视频 | 亚洲精品在线电影 | 久久a v电影| 五月视频 | 中文字幕在线视频一区二区 | 日韩午夜精品福利 | 日韩av高清在线观看 | 成人毛片一区 | 免费又黄又爽视频 | 亚州精品视频 | 成人av在线一区二区 | 久草热久草视频 | 免费看污网站 | 97精产国品一二三产区在线 | 五月天久久激情 | 日韩区在线观看 | 手机在线永久免费观看av片 | 日韩xxx视频 | 国产黄免费 | 国产在线 一区二区三区 | 五月激情丁香图片 | 日韩av免费观看网站 | 91成人在线观看高潮 | 中文字幕久久网 | 日韩中文字幕在线不卡 | 国产伦理剧 | 国产精品扒开做爽爽的视频 | 91视频xxxx | 国产美女主播精品一区二区三区 | 日韩啪啪小视频 | 久久永久免费 | 久久国产精品久久精品 | 日韩一区二区三区免费电影 | 免费日韩视| 一级黄色片在线免费观看 | 日本aaaa级毛片在线看 | 九九热视频在线免费观看 | 五月天综合色激情 | 亚洲天堂网在线视频观看 | 小草av在线播放 | 一级黄色av | 九九九热| 国产综合精品一区二区三区 | 91在线公开视频 | av免费观看高清 | 男女全黄一级一级高潮免费看 | 日批视频在线观看免费 | 日韩成人免费在线观看 | 成人国产精品免费观看 | 在线色亚洲 | 操久| 亚洲视频网站在线观看 | 成年人av在线播放 | 久久精品之 | 成人精品国产免费网站 | 人人澡澡人人 | 国产小视频在线 | 欧洲亚洲精品 | 九九九在线观看 | 亚洲综合在线视频 | 久久久国产精品人人片99精片欧美一 | 丁香婷婷在线观看 | 欧美人操人 | 亚洲人久久久 | 在线视频 国产 日韩 | 久久99精品国产麻豆宅宅 | 久久系列 | 九九涩涩av台湾日本热热 | 久热爱 | 久久国产精品网站 | 五月婷婷毛片 | 欧美美女视频在线观看 | 亚洲精品国精品久久99热 | 亚洲成av人影院 | 一区二区视频在线看 | 国产精品永久久久久久久www | 日韩av影视 | 亚洲国产999 | 最近日本中文字幕 | 亚洲视频电影在线 | 日韩欧美在线国产 | 色婷婷欧美 | 日韩一区二区三区在线看 | 久久一区二区三区超碰国产精品 | 免费观看的黄色片 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国产精品高潮呻吟久久久久 | 国产一区二区三区免费视频 | 欧美精品久久久久久 | 91精品导航| 手机看片午夜 | 欧美aa在线| 亚洲精品视频播放 | 久久av中文字幕片 | 最近最新最好看中文视频 | 欧美日韩亚洲国产一区 | 丁香婷婷综合激情五月色 | 国产在线综合视频 | 一级理论片在线观看 | 伊人国产视频 | 91精品国产乱码在线观看 | 亚洲精品在线观看的 | av在线网站免费观看 | 久久久免费观看完整版 | 久久久久久毛片精品免费不卡 | 久久国产精品久久久 | 国产亚洲精品久久久久久网站 | 日本精品久久久久影院 | 99视频 | av福利免费 | 正在播放国产91 | 中文字幕a∨在线乱码免费看 | 亚洲精品久久久蜜桃直播 | 久久综合久久综合久久综合 | 在线观看av免费观看 | 精品一区二区三区久久久 | 天天综合网 天天 | 激情 亚洲| 午夜少妇av | 国产在线探花 | 97精品一区| 中文在线www | 成人一区二区在线观看 | 高清不卡毛片 | 婷婷丁香激情网 | 蜜桃麻豆www久久囤产精品 | 日韩黄色在线电影 | 天天天天色射综合 | 婷婷五月情 | 国产精品一区久久久久 | 日韩中文在线播放 | 成人a视频 | 久久99国产精品免费 | 欧美日韩在线观看一区 | 亚洲最大av | 99成人在线视频 | 色www精品视频在线观看 | 96视频在线| 国产在线观看中文字幕 | 国产精品不卡一区 | 日韩电影中文 | 中文字幕资源网在线观看 | 日本久久久久久久久 | 婷婷狠狠操 | 91精品一区二区三区蜜臀 | 久久伊人八月婷婷综合激情 | 国产精品黄色在线观看 | 国产中文字幕网 | 最近免费在线观看 | 色视频在线观看免费 | 免费日韩三级 | 欧美成人精品三级在线观看播放 |