java io 讀書筆記

閱讀《java+TCP/IP+Socket編程》隨筆

  1. 套接字:java爲是實現應用程序的相互通信提供了許多api,這類應用接口的api稱爲套接字。
  2. 分組報文:由程序創建和解釋的字節序列。一組報文包括了網絡用來完成工作的控制信息,有時還包括一些用戶數據。路由器就是通過這些控制信息來實現對每個報文的轉發(路由器的作用就是將信息從一個通信信道傳遞或轉發到另一個通信信道)。
  3. 協議:相當於相互通信的程序間達成的一種約定,它規定了分組報文的交換方式和它們包含的意義(即該如何解析分組報文)。
  4. io網絡傳輸的流程:application->socket(套接字)->UDP/TCP->IP->channel->Router IP->channel->IP-UDP/TCP->socket->application
  5. ip協議(盡力而爲協議,best-effort)所在的層爲網絡層(識別網絡上的每一個主機),在它之上的就是UDP/TCP和socket套接字的傳輸層。既然是盡力而爲就會發生報文丟失、重複及其他錯誤。TCP協議能夠檢測和恢復這些錯誤,爲UDP僅僅只是擴展了尋址的功能,不會修復錯誤。
  6. UDP/TCP在ip層提供的基礎服務之上,使用了不同的方法來實現不同方式的傳輸。它們有一個共同的功能,即尋址。當ip找到主機後,還需要更細粒度的尋址將報文發送到主機中指定的應用程序(即端口),因此它們也稱爲端到端傳輸協議。
  7. ipv4中有一些私有用途的地址:所有以10或192.168開頭的地址,以及第一個數是172,第二個數在16到31的地址。它們不屬於公共互聯網,從公共互聯網不能訪問到這些地址。但是這些地址可以通過NAT(網絡地址轉換)設備連接到互聯網。這設備的功能是將一個接口中報文的私有地址端口對映射成另一個接口中的共有地址端口對,這也就使一小組主機能夠有效的共享同一個IP地址。
    還有一個就是迴環地址127.0.0.1[] ,它的功能只是簡單地將發送給它的報文直接回發給發送者。
  8. NetWorkInterface.getNetworkInterfaces()返回包含了該主機每一個接口所對應的NetworkInterface類實例 InetAddress
  9. read數據的時候注意:數據可能從多個塊(chunks)中返回,所以要多次read;
  10. Serversocket(int port, it queueLimit, InetAddress localAddr); 注意最後一個本地接口地址的參數,這樣對有多個接口(多個ip)而服務器只接受其中一個接口連接的主機非常有用。
  11. 流:是一個簡單有效的字節序列,xxxStream用來操縱它。
  12. 注意inputStream的read()方法,如果沒有數據可讀同時又沒有檢測到流結束標記時,所有的read()方法都將阻塞。
  13. UDP注意設置timeout時間,防止一直阻塞在receive()方法,原理同上。
  14. 重要的區別:UDP協議保留了消息的邊界信息。DatagramSocket的每一次receive()調用最多隻能接受調用一次send()方法所發送的數據。而且不同的receive()方法調用絕不會返回同一個send()方法調用所發送的數據。同時receive()方法的DatagramPacket的過小,就會造成消息丟失,且沒有任何提示。
  15. 因爲DatagramPacket內部的消息長度值會變,所以每次使用都要重置爲緩衝區大小;而且getData()方法返回的是緩衝區的原始大小,所以一定要關注發送時的偏移量和消息長度。
  16. TCP協議的定界符:要麼顯式定義唯一特殊符號,要麼加一個顯式長度;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章