一、網路基礎知識
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)地址。該類無構造方法
三、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()方法可以得到指定資源的輸入流,透過流能夠讀取或訪問網頁上的資源
如圖所示:
TCP程式設計
TCP協議是面向連線的、可靠的、有序的、以位元組流的方式傳送資料,透過三次握手方式建立連線,形成傳輸資料的通道,在連線中進行大量資料的傳輸,效率會稍低
Java中基於TCP協議實現網路通訊的類 客戶端的Socket類 伺服器端的ServerSocket類
Socket通訊的步驟
建立ServerSocket和Socket
開啟連線到Socket的輸入/輸出流
按照協議對Socket進行讀/寫操作
關閉輸入輸出流、關閉Socket
伺服器端:
建立ServerSocket物件,繫結監聽埠
透過accept()方法監聽客戶端請求
連線建立後,透過輸入流讀取客戶端傳送的請求資訊
透過輸出流向客戶端傳送鄉音資訊
關閉相關資源
如圖所示:
客戶端:
建立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
接受客戶端傳送的資料資訊
讀取資料
客戶端實現步驟
定義傳送資訊
建立DatagramPacket,包含將要傳送的資訊
建立DatagramSocket
傳送資料
六、注意問題
多執行緒的優先順序問題
: 根據實際的經驗,適當的降低優先順序,否側可能會有程式執行效率低的情況
是否關閉輸出流和輸入流
:對於同一個socket,如果關閉了輸出流,則與該輸出流關聯的socket也會被關閉,所以一般不用關閉流,直接關閉socket即可
使用TCP通訊傳輸物件,IO中序列化部分
socket程式設計傳遞檔案,IO流部分