天天看點

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

學習Java的第022天——寫在端午節之後

了解學習了網絡程式設計的基本概念,IP和端口、socket含義,TCP協定和UDP協定 、InetAddress/InetSocketAddress/URL、基于TCP的Socket程式設計 、基于TCP的Socket程式設計實作聊天室等内容等。

首先:計算機網絡的作用是資源共享和資訊傳遞。

2. 計算機網絡的組成:

a) 計算機硬體:計算機(大中小型伺服器,桌上型電腦、筆記本等)、外部裝置(路由器、交換機等)、通信線路(雙絞線、光纖等)。

b) 計算機軟體:網絡作業系統(Windows 2000 Server/Advance Server、Unix、Linux等)、網絡管理軟體(WorkWin、SugarNMS等)、網絡通信協定(如TCP/IP協定棧等)。

3. 計算機網絡的多台計算機是具有獨立功能的,而不是脫離網絡就無法存在的。

(1) 網絡程式設計的三要素是什麼?

①IP 位址:唯一辨別網絡上的每一台計算機,兩台計算機之 間通信的必備有素 ;

②端口号:計算機中應用的标号(代表一個應用程式), 0-1024 系統使用或保留端口 ,端号口占 2 個位元組,是以 有效端口 0-65535 ;

③通信協定:通信的規則 TCP,UDP 。

解釋一下通信協定就是:

通過計算機網絡可以實作不同計算機之間的連接配接與通信,但是計算機網絡中實作通信必須有一些約定即通信協定,對速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等制定标準。

國際标準化組織(ISO,即International Organization for Standardization)定義了網絡通信協定的基本架構,被稱為OSI(Open System Interconnect,即開放系統互聯)模型。OSI模型制定的七層标準模型,分别是:應用層,表示層,會話層,傳輸層,網絡層,資料鍊路層,實體層。

雖然國際标準化組織制定了這樣一個網絡通信協定的模型,但是實際上網際網路通訊使用最多的網絡通信協定是TCP/IP網絡通信協定。

TCP/IP 是一個協定族,也是按照層次劃分,共四層:應用層,傳輸層,互連網絡層,網絡接口層(實體+資料鍊路層)。

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

開放系統互連參考模型與TCP/IP參考模型對比

用來辨別網絡中的一個通信實體的位址。通信實體可以是計算機、路由器等。 比如網際網路的每個伺服器都要有自己的IP位址,而每個區域網路的計算機要通信也要配置IP位址。路由器是連接配接兩個或多個網絡的網絡裝置。

目前主流使用的IP位址是IPV4,但是随着網絡規模的不斷擴大,IPV4面臨着枯竭的危險,是以推出了IPV6。

IPV4:32位位址,并以8位為一個機關,分成四部分,以點分十進制表示,如192.168.0.1。因為8位二進制的計數範圍是00000000---11111111,對應十進制的0-255,是以-4.278.4.1是錯誤的IPV4位址。

IPV6:128位(16個位元組)寫成8個16位的無符号整數,每個整數用四個十六進制位表示,每個數之間用冒号(:)分開,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984

需要知道的是:

1. 127.0.0.1 本機位址

2. 192.168.0.0--192.168.255.255為私有位址,屬于非注冊位址,專門為組織機構内部使用。

IP位址用來辨別一台計算機,但是一台計算機上可能提供多種網絡應用程式,如何來區分這些不同的程式呢?這就要用到端口。

端口是虛拟的概念,并不是說在主機上真的有若幹個端口。通過端口,可以在一個主機上運作多個網絡應用程式。 端口的表示是一個16位的二進制整數,對應十進制的0-65535。

.IP位址好比每個人的位址(門牌号),端口好比是房間号。必須同時指定IP位址和端口号才能夠正确的發送資料。

我們開發的網絡應用程式位于應用層,TCP和UDP屬于傳輸層協定,在應用層如何使用傳輸層的服務呢?在應用層和傳輸層之間,則是使用套接Socket來進行分離。

套接字就像是傳輸層為應用層開的一個小口,應用程式通過這個小口向遠端發送資料,或者接收遠端發來的資料;而這個小口以内,也就是資料進入這個口之後,或者資料從這個口出來之前,是不知道也不需要知道的,也不會關心它如何傳輸,這屬于網絡其它層次工作。

Socket實際是傳輸層供給應用層的程式設計接口。Socket就是應用層與傳輸層之間的橋梁。使用Socket程式設計可以開發客戶機和伺服器應用程式,可以在本地網絡上進行通信,也可通過Internet在全球範圍内通信。

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

Socket的作用

TCP協定和UDP協定是傳輸層的兩種協定。Socket是傳輸層供給應用層的程式設計接口,是以Socket程式設計就分為TCP程式設計和UDP程式設計兩類。

在網絡通訊中,TCP方式就類似于撥打電話,使用該種方式進行網絡通訊時,需要建立專門的虛拟連接配接,然後進行可靠的資料傳輸,如果資料發送失敗,則用戶端會自動重發該資料。而UDP方式就類似于發送短信,使用這種方式進行網絡通訊時,不需要建立專門的虛拟連接配接,傳輸也不是很可靠,如果發送失敗則用戶端無法獲得。

總的來講就是:

TCP是面向連接配接的,傳輸資料安全,穩定,效率相對較低。

UDP是面向無連接配接的,傳輸資料不安全,效率較高。

TCP通信原理是:

伺服器建立 ServerSocket,在指定端口監聽并處理請求;

用戶端建立 Socket,向伺服器發送請求 ;

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

TCP在建立連接配接時又分三步走:

第一步,是請求端(用戶端)發送一個包含SYN即同步(Synchronize)标志的TCP封包,SYN同步封包會指明用戶端使用的端口以及TCP連接配接的初始序号。

第二步,伺服器在收到用戶端的SYN封包後,将傳回一個SYN+ACK的封包,表示用戶端的請求被接受,同時TCP序号被加一,ACK即确認(Acknowledgement)。

第三步,用戶端也傳回一個确認封包ACK給伺服器端,同樣TCP序列号被加一,到此一個TCP連接配接完成。然後才開始通信的第二步:資料處理。

這就是所說的TCP的三次握手(Three-way Handshake)。

基于UDP協定的通信方式,稱為資料報通信方式。在這種方式中,每個資料發送單元被統一封裝成資料報包的方式,發送方将資料報包發送到網絡中,資料報包在網絡中去尋找它的目的地。

UDP協定的特點是:

Ø 不需要利用 IO 流實作資料的傳輸

Ø 每個資料發送單元被統一封裝成資料包的方式,發送方将資料包發送到網絡中,資料包在網絡中去尋找他的目的地。

Ø DatagramSocket:用于發送或接收資料包

Ø DatagramPacket:資料包

Java為了可移植性,不允許直接調用作業系統,而是由http://java.net包來提供網絡功能。Java虛拟機負責提供與作業系統的實際連接配接。

InetAddress類的作用及常用方法;

作用:封裝計算機的IP 位址,不包含端口号

方法:String getHostAddress()-----獲得IP 位址

String getHostName()-----獲得主機名

static InetAddress getByName(String host)-----根據主機名獲得IP 位址

InetSocketAddress類的作用及常用方法;

作用:此類用于實作 IP套接字位址 (IP 位址+端口号),用于socket 通信

方法:InetAddress getAddress()-----擷取InetAddress對象

int getPort()-----擷取端口号

String getHostName()-----擷取主機名

IP位址唯一辨別了Internet上的計算機,而URL則辨別了這些計算機上的資源。類 URL 代表一個統一資源定位符,它是指向網際網路“資源”的指針。資源可以是簡單的檔案或目錄,也可以是對更為複雜的對象的引用,例如對資料庫或搜尋引擎的查詢。

URL的常用方法有:

String getProtocal()-----擷取此 URL 的協定名稱

String getHost()-----擷取此 URL 的主機名(如果适用)

int getPort()-----擷取 URL 的端口号

String getFile()-----擷取此 URL 的檔案名

getDefaultPort()-----擷取與此 URL 關聯協定的預設端口号

getPath()-----擷取此 URL 的路徑部分

openStream()方法-----打開到此 URL 的連接配接并傳回一個用于從該連接配接讀入的 InputStream 。

基于TCP協定的Socket程式設計_雙向通信_實作單次請求與響應

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

Soket程式設計實作一次雙向通信的傳輸示意圖

(1) 實作一次單次請求與響應,用戶端與伺服器的操作步驟是什麼?

用戶端:

1. 建立Socket對象

2. 擷取輸出流

3. 擷取輸入流

4. 關閉流,關閉Socket。

伺服器端:

1.建立ServerSocket對象

2. 監聽是否有用戶端請求連接配接

3. 擷取輸入流

4. 擷取輸出流

5. 關閉流,關閉Socket

也可以說:

Ø 1. 建立伺服器ServerSocket,在建立時,定義ServerSocket的監聽端口(在這個端口接收用戶端發來的消息)。

Ø 2. ServerSocket調用accept()方法,使之處于阻塞狀态。

Ø 3. 建立用戶端Socket,并設定伺服器的IP及端口。

Ø 4. 用戶端發出連接配接請求,建立連接配接。

Ø 5. 分别取得伺服器和用戶端Socket的InputStream和OutputStream。

Ø 6. 利用Socket和ServerSocket進行資料傳輸。

Ø 7. 關閉流及Socket

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

雙向通信_實作單次請求與響應---用戶端

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

雙向通信_實作單次請求與響應---伺服器端

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

兩台電腦可以進行簡單的單次雙向通信

TCP協定的Socket程式設計_雙向通信_實作模拟使用者登入

雙向通信使用者登入的示意圖:

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

使用者登入的過程用戶端與伺服器的功能如下

用戶端:1.建立Socket對象

2. 擷取輸出流(對象流)

3. 建立User對象,将封裝後的對象發送伺服器 4. 擷取輸入流(資料流)

5. 關閉流,關閉Socket

功能:發送使用者的資訊接收伺服器的響應

伺服器端:1. 建立ServerSocket對象

2. 擷取輸入流

3. 對使用者名和密碼進行驗證

4. 擷取輸出流

5. 關閉流

功能:接收用戶端的請求和響應用戶端

用戶端與伺服器端單次聊天的缺點是:

隻能用戶端先發送資料,然後才能接收資料,如果不發就 收不到,(接收和發送是在一個線程中實作的)不符合實際情況

單次聊天的缺點的解決方案是

① 多次聊天可以使用循環來解決

② 先發後收的問題可以使用線程來解決,一個接收資料的線 程,一個發送資料的線程

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

實作群聊的原理是:

用戶端建立接收和發送的線程。

伺服器端建立多個用戶端路徑的線程

使用集合實作轉發效果。

java socket如何請求485協定_學習Java的022天,認識網絡程式設計

群聊實作的步驟為:

用戶端:1.建立Socket對象

2. 建立發送的線程類對象

3. 建立接收的線程類對象

4. 建立Thread類對象并啟動線程

5. 關閉流

伺服器端:1. 建立集合對象,存儲每一個連接配接進來的用戶端

2. 建立ServerSocket對象

3. 監聽用戶端是否有用戶端連接配接

4. 建立線程類的對象

5. 添加到集合中

6. 啟動線程

7. 關閉流

(缺少的示例程式後續會練習并補充)