JAVA Socket網路程式設計

一、網路基礎知識

1、兩臺計算機間進行通訊需要以下三個條件:IP地址、協議、埠號

2、TCP/IP協議:是目前世界上應用最為廣泛的協議,是以TCP和IP為基礎的不同層次上多個協議的集合,也成TCP/IP協議族、或TCP/IP協議棧

TCP:Transmission Control Protocol 傳輸控制協議

IP:Internet Protocol 網際網路協議

3、TCP/IP五層模型

應用層:HTTP、FTP、SMTP、Telnet等

傳輸層:TCP/IP

網路層:

資料鏈路層:

物理層:網線、雙絞線、網絡卡等

4、IP地址 為實現網路中不同計算機之間的通訊,每臺計算機都必須有一個唯一的標識——-IP地址。32位二進位制

5、埠

區分一臺主機的多個不同應用程式,埠號範圍為0-65535,其中0-1023位為系統保留。

如:HTTP:80 FTP:21 Telnet:23

IP地址+埠號組成了所謂的Socket,Socket是網路上執行的程式之間雙向通訊鏈路的終結點,是TCP和UDP的基礎

6、Socket套接字:網路上具有唯一標識的IP地址和埠組合在一起才能構成唯一能識別的識別符號套接字。

Socket原理機制:通訊的兩端都有Socket,網路通訊其實就是Socket間的通訊,資料在兩個Socket間透過IO傳輸

7、Java中的網路支援

針對網路通訊的不同層次,Java提供了不同的API,其提供的網路功能有四大類:

InetAddress:用於標識網路上的硬體資源,主要是IP地址

URL:統一資源定位符,透過URL可以直接讀取或寫入網路上的資料

Sockets:使用TCP協議實現的網路通訊Socket相關的類

Datagram:使用UDP協議,將資料儲存在使用者資料報中,透過網路進行通訊。

二、InetAddress

InetAddress類用於標識網路上的硬體資源,標識網際網路協議(IP)地址。該類無構造方法

JAVA Socket網路程式設計

三、URL類

URL(Uniform Resource Locator)統一資源定位符,表示Internet上某一資源的地址,協議名:資源名稱

URL baidu =new URL(“path”);//建立一個URL的例項

URL url =new URL(baidu,“/index。html?username=tom#test”);//?後表示引數,#後表示錨點

url。getProtocol();//獲取協議

url。getHost();//獲取主機

url。getPort();//如果沒有指定埠號,根據協議不同使用預設埠。此時getPort()方法的返回值為 -1

url。getPath();//獲取檔案路徑

url。getFile();//檔名,包括檔案路徑+引數

url。getRef();//相對路徑,就是錨點,即#號後面的內容

url。getQuery();//查詢字串,即引數

使用URL讀取網頁內容 透過URL物件的openStream()方法可以得到指定資源的輸入流,透過流能夠讀取或訪問網頁上的資源

如圖所示:

JAVA Socket網路程式設計

TCP程式設計

TCP協議是面向連線的、可靠的、有序的、以位元組流的方式傳送資料,透過三次握手方式建立連線,形成傳輸資料的通道,在連線中進行大量資料的傳輸,效率會稍低

Java中基於TCP協議實現網路通訊的類 客戶端的Socket類 伺服器端的ServerSocket類

Socket通訊的步驟

建立ServerSocket和Socket

開啟連線到Socket的輸入/輸出流

按照協議對Socket進行讀/寫操作

關閉輸入輸出流、關閉Socket

伺服器端:

建立ServerSocket物件,繫結監聽埠

透過accept()方法監聽客戶端請求

連線建立後,透過輸入流讀取客戶端傳送的請求資訊

透過輸出流向客戶端傳送鄉音資訊

關閉相關資源

如圖所示:

JAVA Socket網路程式設計

客戶端:

建立Socket物件,指明需要連線的伺服器的地址和埠號

連線建立後,透過輸出流想伺服器端傳送請求資訊

透過輸入流獲取伺服器響應的資訊

關閉響應資源

JAVA Socket網路程式設計

應用多執行緒實現伺服器與多客戶端之間的通訊

伺服器端建立ServerSocket,迴圈呼叫accept()等待客戶端連線

客戶端建立一個socket並請求和伺服器端連線

伺服器端接受苦讀段請求,建立socket與該客戶建立專線連線

建立連線的兩個socket在一個單獨的執行緒上對話

伺服器端繼續等待新的連線

多執行緒例子:

//伺服器執行緒處理

Socket socket =null;

public serverThread(Socket socket){

this.socket = socket;

}

public void run(){

//伺服器處理程式碼

}

//伺服器程式碼

ServerSocket serverSocket =newServerSocket(10086);

Socket socket =null;

int count =0;//記錄客戶端的數量

while(true){

socket = serverScoket.accept();

ServerThread serverThread =newServerThread(socket);

serverThread.start();

count++;

System.out.println("客戶端連線的數量:"+count);

}

五、UDP程式設計

UDP協議(使用者資料報協議)是

無連線的、不可靠的、無序的,速度快。

進行資料傳輸時,首先將要傳輸的資料定義成資料報(Datagram),

大小限制在64k

,在資料報中指明資料索要達到的Socket(主機地址和埠號),然後再將資料報傳送出去

DatagramPacket類:表示資料報包

DatagramSocket類:進行端到端通訊的類

eg: 實現一個Demo

伺服器端實現步驟

建立DatagramSocket,指定埠號

建立DatagramPacket

接受客戶端傳送的資料資訊

讀取資料

JAVA Socket網路程式設計

客戶端實現步驟

定義傳送資訊

建立DatagramPacket,包含將要傳送的資訊

建立DatagramSocket

傳送資料

JAVA Socket網路程式設計

六、注意問題

多執行緒的優先順序問題

: 根據實際的經驗,適當的降低優先順序,否側可能會有程式執行效率低的情況

是否關閉輸出流和輸入流

:對於同一個socket,如果關閉了輸出流,則與該輸出流關聯的socket也會被關閉,所以一般不用關閉流,直接關閉socket即可

使用TCP通訊傳輸物件,IO中序列化部分

socket程式設計傳遞檔案,IO流部分

JAVA Socket網路程式設計