1. 程式人生 > >Socket網路程式設計(備忘)

Socket網路程式設計(備忘)

一、概述

基於TCP協議的Socket程式設計體驗之

——線上客戶系統使用者登入

1、Socket簡介

2、Socket通訊原理

3、Socket類以及ServerSocket類如何使用

4、InetAddress類如何使用

基於UDP協議的Socket程式設計體驗之

——線上客戶系統客戶諮詢

1、DatagramSocket類如何使用

2、DatagramPacket類如何使用

1、TCP:Transmission Control Protocol傳輸控制協議,TCP是一種面向連線(連線導向)的、可靠的、基於位元組流的運輸層(Transport layer)通訊協議,由IETF的RFC 793說明(specified)。在簡化的計算機網路OSI模型中,它完成地四層傳輸層所指定的功能。

類似於撥打電話,使用該種方式進行網路通訊時,需要建立專門的虛擬連線,然後進行可靠的資料傳輸,如果資料傳送失敗,則客戶端會自動重發該資料。

2、UDP:User Datagram Protocol的簡稱,中文名是使用者資料報協議,是OSI參考模型中的一種無連線的傳輸層協議,提供面向事物的簡單不可靠資訊傳送服務,IETF RFC 768是UDP的正式規範。

UDP類似於傳送簡訊,使用這種方式進行網路通訊時,不需要建立專門的虛擬連線,傳輸也不是很可靠,如果傳送失敗則客戶端無法獲得。

3、總結:

這兩種傳輸方式都是實際的網路程式設計中進行使用,重要的資料一般使用TCP方式進行資料傳輸,而大量的非核心資料

則都通過UDP方式進行傳遞,在一些程式中甚至結合使用這兩種方式進行資料的傳遞。由於TCP需要建立專門的虛擬連線以及確認傳輸是否正確,所以使用TCP方式的速度稍微慢一些,而且傳輸時產生的資料量要比UDP稍微大一些。

4、區別:

TCP

UDP

由於它是一個面向連線的協議,在Socket之間進行資料傳輸之前必然要建立連線,所以在TCP中多了一個連線建立的時間。

使用UDP時,每個資料報中都給出了完整的地址資訊,因此無需要建立傳送方和接收方的連線

TCP沒有這方面的限制,一旦連線建立起來,雙方的socket就可以按統一的格式傳輸大量的資料

使用UDP傳輸資料時時有大小限制的,每個被傳輸的資料報必須限定在64KB之內。

TCP在網路同心上有極強的生命力,例如遠端連線(Telnet)和檔案傳輸(FTP)都需要不定長度的資料被可靠地傳輸

相比之下,UDP操作簡單,而且需要較少的監護,因此通常用於區域網高可靠性的分散系統中的client/server應用程式

TCP是一個可靠的協議,它確保接收方完全正確地獲取傳送方所傳送的全部資料

UDP是一個不可靠的協議,傳送方所傳送的資料報並不一定以相同的次序到達接收方。

二、學習方法

1、瞭解Socket的概念、起源、分類等相關知識,只需要聽懂並看懂課件中的內容即可。

2、Socket通訊原理以及Socket類、ServerSocket類的使用是重點內容

瞭解DatagramSocket類、DatagramPacket類的使用,看懂並完成任務即可

三、Socket

1、簡介:

套接字;應用程式通過“套接字”向網路發出請求或者應答網路請求;

最早是UNIX上的一套網路程式通訊的標準;已被廣泛移植到其它平臺;

Socket實質上提供了程序通訊的端點,網路上的兩個程式通過一個雙向的通訊鏈路實現資料的交換,這個雙向鏈路的一端稱為一個Socket。


Socket封裝了應用層和傳輸層的功能,不需要我們自己去實現。

實際上Socket就相當於我們現實生活的一個插座,我們根據我們需要的來選取合適的插座。

2、分類:

一共有三類:

(1)流式套接字(SOCK_STREAM):提供了一個面向連線,可靠的資料傳輸服務,資料無差錯、五重複的傳送,且按傳送順序接收,其實它對應使用的是TCP協議。

(2)資料報式套接字(SOCK_DGRAM):無連線服務,資料報以獨立包形式被髮送,不提供無差錯保證,資料可能丟失或重複,並且接收順序無序,其實它對應使用的是UDP協議。

(3)原始式套接字(SOCK_RAM):該介面允許對較低層次協議,如IP直接訪問。可以接受本機網絡卡上的資料幀或資料包,對監聽網路流量和分析很有用。

我們主要是學習流式套接字和資料報式套接字

3、Socket通訊原理概述

就相當於打電話一樣


四、基於TCP協議的Socket程式設計

相關的類是Socket類、ServerSocket類,都被封裝在java.net包中

1、Socket類

(1)Socket類的構造方法

構造方法

說明

Socket(String host,int port)

向host主機的port埠發起連線請求

Socket(String host,int port,InetAddress localAddr,int localPort)

向host主機的port埠發起連線請求,發起請求的計算機為localAddr,埠為localPort

InetAddress類表示網際網路協議地址,包含IP地址,InetAddress類是java對IP地址的封裝。

(2)Socket類的常用方法

常用方法

說明

InetAddress getInetAddress()

返回與當前Socket物件關聯的InetAddress物件

void shutdownInput()

此套接字的輸入流置於“流的末尾”

void shutdownOutput()

禁用此套接字的輸出流

InputStream getInputStream()

返回當前Socket物件關聯的InputStream物件,它是伺服器端向客戶端傳送回來的資料流。

OutputStream getOutputStream()

返回當前Socket物件關聯的OutputStream物件,它是客戶端向伺服器端傳送的資料流。

Void close()

關閉該Socket物件建立的連線


2、ServerSocket類

(1)ServerSocket類的構造方法

構造方法

說明

ServerSocket()

建立一個ServerSocket物件。

ServerSocket(int port)

建立一個ServerSocket物件,並繫結到繫結的埠。

(2)ServerSocket類的常用方法

常用方法

說明

Socket accept()

偵聽並接收到此ServerSocket的連線,此方法在連線傳入之前一直阻塞。

void close()

是伺服器釋放佔用的資源,並斷開所有客戶端的連線。

InetAddress getInetAddress()

返回當前伺服器繫結的IP地址資訊。

3、例項

(1)使用者登入——字串方式

Server(伺服器端)

1、建立一個伺服器端的Socket(ServerSocket),指定繫結埠,並等待監聽;

2、使用accept()方法來阻塞等待監聽,獲取新的連線;(實際上就是通過該方法獲取Socket物件);

3、獲取Socket的輸入輸出流,進行操作(讀取並響應客戶端請求);

4、關閉資源。

Client(客戶端)

1、建立Socket物件,與伺服器建立連線;

2、獲取輸入輸出流,進行操作(給伺服器端傳送請求並獲取伺服器端的響應資訊);

3、關閉資源

注意:方法shutdownOutput()和方法shutdownInput(),在客戶端傳送請求後,使用這兩個方法,才能夠完成整個的通訊(即C與S都進行了請求相關的操作),如果沒有這個兩個方法中的一個,則整個通訊就沒完成。但是兩個方法所得到的結果是不一樣的。

(2)使用者登入——物件方式

   實際過程跟字串方式差不多,但是要注意:

① 就是操作物件的流與操作字串的流是不一樣的。操作字串的讀寫流我們用的是BufferedReader/PriteWriter,操作物件的讀寫流我們用的是ObjectInputStream/ObjectOutputStream;

② 還有一點就是要注意我們操作的物件必須是實現了序列化的才行,不然會報錯。

(3)使用者登入——多客戶端

建立一個執行緒類,放到Server端,就可以實現多個Client訪問該Server了。


(4)伺服器獲取客戶端的IP資訊


4、總結(Socket程式設計步驟)

Server(伺服器端)

1、建議一個伺服器Socket(ServerSocket)繫結指定埠並開始監聽;

2、使用accept()方法阻塞等待監聽,獲得新的連線;

3、建立輸入和輸出流;

4、在已有的協議上產生會話;

5、使用close()關閉資源。

Client(客戶端)

1、建立客戶端Socket連線,指定伺服器的位置以及埠;

2、得到Socket的讀寫流;

3、利用流按照一定的協議對Socket進行讀寫操作;

4、使用close()關閉資源。

5、Socket通訊原理詳解


6、InetAddress類

如何在伺服器端獲取每個客戶端的IP地址呢?

思路:

(1)InetAddress類:表示網際網路協議地址,包含IP地址,是Java對IP地址的封裝,它可以通過Socket的getAddress()方法獲得。

(2)java.net.InetAddress類的常用方法:

常用方法

說明

getHostAddress()

返回IP地址字串(以文字表現形式);

getHostName()

獲得此IP地址的主機名。

五、基於UDP協議的Socket程式設計

1、基於UDP協議的Socket(資料報式套接字)

基於UDP協議;無連線;透出資料包快遞高速;資料安全性不佳。

比如:網路遊戲,視訊會話,QQ聊天資訊

2、類

DatagramSocket類:傳送和接收資料包的套接字,不維護連線狀態,不產生輸入輸出流;

DatagramPacket類:資料包,封裝了資料、資料長度、目標地址和目標埠。

注意:客戶端要向外傳送資料,必須首先建立一個DatagramPacket的物件,再使用DatagramSocket物件傳送。

3、DatagramPacket類:

構造方法

說明

DatagramPacket(byte[]buf,int length,InetAddress address,int port)

構造DatagramPacket物件,用來將長度為length的包傳送到指定主機上的指定埠號。

DatagramPacket(byte[]buf,int length)

構造DatagramPacket,用來接收長度為length的資料包。

DatagramPacket(byte[]buf,int length,SocketAddress sa)

構造資料報包,用來將長度為length的包傳送到指定主機上的指定埠號。

4、DatagramSocket類

構造方法

說明

DatagramSocket()

建立一個DatagramSocket物件,並將其與本地主機上任何可用的埠繫結。

DatagramSocket(int port)

建立一個DatagramSocket物件,並將其與本地主機上的指定埠繫結。

常用方法

說明

void send(DatagramPacket p)

傳送指定的資料報

void receive(DatagramPacket p)

接收資料報,手打資料以後,存放在指定的DatagramPacket物件中

void close()

關閉當前DatagramSocket物件

5、例子——線上客服系統客戶諮詢

用DatagramSocket來傳輸資料,而傳輸的資料是以資料報包(DatagramPacket)的形式存在的,基本的程式設計過程為:

Server(伺服器)

Client(客戶端)

1、建立接收方(伺服器端)的套接字,也就是DatagramSocket物件;

2、建立接收型別的資料報包(其中資料報包中的資料是以位元組陣列的形式存在的);

3、通過套接字(DatagramSocket)來接收資料報包(也就是客戶端的請求資訊);

4、響應客戶端的請求,把資料(響應資訊)包裝在資料報包中;

5、傳送響應給客戶端(響應客戶端的請求);

6、釋放資源。

1、建立傳送方(客戶端)的套接字;

2、建立傳送的請求(客戶端的請求)資料的資料報包,包括請求的資訊、伺服器地址以及埠號;

3、傳送請求給伺服器;

4、接收伺服器的響應資訊的資料報包;

5、通過套接字接收伺服器的響應;

6、釋放資源。