日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网络——连接到server

發(fā)布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网络——连接到server 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【0】README

0.1) 本文描述部分轉自 core java volume 2 , 旨在理解 網(wǎng)絡——連接到server 的基礎知識 ;
0.2) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter3/SocketTest.java + https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter3/InetAddressTest.java ;


【1】連接到服務器相關

1)首先了解 telnet 這個工具,調(diào)試網(wǎng)絡程序非常有幫助;

  • 1.1)telnet 簡介: Telnet是進行遠程登錄的標準協(xié)議和主要方式,它為用戶提供了在本地計算機上完成遠程主機工作的能力。可以用telnet命令來測試端口號是否正常打開還是關閉狀態(tài)。
  • 1.2)Telnet 客戶端命常用命令:
    • open : 使用 openhostname 可以建立到主機的 Telnet 連接。
    • close : 使用命令 close 命令可以關閉現(xiàn)有的 Telnet 連接。
    • display : 使用 display 命令可以查看 Telnet 客戶端的當前設置。
    • send : 使用 send 命令可以向 Telnet 服務器發(fā)送命令。支持以下命令:
    • ao : 放棄輸出命令。
    • ayt : “Are you there”命令。
    • esc : 發(fā)送當前的轉義字符。
    • ip : 中斷進程命令。
    • synch : 執(zhí)行 Telnet 同步操作。
    • brk : 發(fā)送信號。
        上表所列命令以外的其他命令都將以字符串的形式發(fā)送至 Telnet 服務器。例如,sendabcd 將發(fā)送字符串 abcd 至 Telnet 服務器,這樣,Telnet 會話窗口中將出現(xiàn)該字符串。
    • quit : 使用 quit 命令可以退出 Telnet 客戶端。

  • 1.3)運行在遠程計算機上的服務器軟件不停等待那些希望與端口13 連接的網(wǎng)絡請求。 一旦建立連接, 遠程程序便發(fā)送回一行數(shù)據(jù), 然后關閉該連接。
try (Socket s = new Socket("time-A.timefreq.bldrdoc.gov", 13)){InputStream inStream = s.getInputStream();Scanner in = new Scanner(inStream);while (in.hasNextLine())


對上述代碼的分析(Analysis):

  • A1)第一行打開一個套接字。它也是網(wǎng)絡軟件(如 telnet 提供本地計算機操作遠程計算機的功能)中的一個抽象概念, 負責啟動該程序內(nèi)部和外部之間的通信;(干貨——套接字的抽象概念的具體含義是網(wǎng)絡軟件,如telnet, 而telnet又是進行遠程登錄的標準協(xié)議和主要方式)
  • A2)一旦套接字被打開: java.net.Socket 類中的getInputStream 方法就會返回一個 InputStream 對象,該對象可以像其他任何流對象一樣使用;

【2】套接字超時

1)problem+solution

  • 1.1)problem:從套接字讀取信息時, 在有數(shù)據(jù)可供訪問之前, 讀操作將會被阻塞;
  • 1.2)solution:對于不同的應用,應該確定合理的超時值,然后調(diào)用 setSoTimeout 方法設置這個超時值, 如:
Socket s = new Socket(...); s.setSoTimeout(10000);

2)捕獲SocketTimeoutException 異常:如果設置了超時, 并且之后的讀操作和寫操作在沒有完成之前就超過了時間限制, 那么這些操作就會拋出 SocketTimeoutException 異常, 你可以捕獲這個異常, 對超時做出反應;
3)另外還有一個超時問題需要解決(problem+solution):

  • 3.1)下面這個構造器(problem): Socket(String host, int port) 會一直無限期地阻塞下去, 直到建立了到達主機的初始連接為止;
  • 3.2)solution:可以通過先構建一個無連接的套接字,然后再使用一個超時來進行連接的方法解決這個問題: (干貨——使用超時限制來解決Socket構造器可能無限阻塞下去的case)
Socket s = new Socket(); s.connect(new InetSocketAddress(host, port), timeout);

【3】因特網(wǎng)地址(主機名和因特網(wǎng)地址間的轉換,使用InetAddress 類)

1)靜態(tài)的getByName 方法可以返回代表某個主機的 InetAddress 對象, 如:

InetAddress address = InetAddress.getByName("www.baidu.com");
  • 1.1)然后使用getAddress 方法來訪問這些字節(jié):
byte[] addressBytes = address.getAddress();
  • 1.2)getAllByName方法:一些訪問量較大的主機名通常會對應多個因特網(wǎng)地址, 以實現(xiàn)負責均衡。當客戶端訪問主機時, 會隨機選擇其中的一個。 可以通過調(diào)用 getAllByName 方法來獲得所有主機: (干貨——訪問量較大的主機名通常會對應多個因特網(wǎng)地址,通過getAllByName方法獲取所有的因特網(wǎng)地址)
String host = args[0]; InetAddress[] addresses = InetAddress.getAllByName(host);
  • 1.3)可以使用靜態(tài)的getLocalHost 方法來得到本地主機的地址:
InetAddress address = InetAddress.getLocalHost();

總結

以上是生活随笔為你收集整理的网络——连接到server的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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