Java最初是作為網絡編程語言出現的,其對網絡提供了高度的支持,使得客戶端和服務器的溝通變成了現實,而在網絡編程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相關的技術。下面就讓我們一起揭開Socket的神秘面紗。
Socket編程
一、網絡基礎知識(參考計算機網絡)
關于計算機網絡部分可以參考相關博客:
《TCP/IP協(xié)議棧及OSI參考模型詳解》
http://wangdy.blog.51cto.com/3845563/1588379
1、兩臺計算機間進行通訊需要以下三個條件:
IP地址、協(xié)議、端口號
2、TCP/IP協(xié)議:
是目前世界上應用最為廣泛的協(xié)議,是以TCP和IP為基礎的不同層次上多個協(xié)議的集合,也成TCP/IP協(xié)議族、或TCP/IP協(xié)議棧
TCP:Transmission Control Protocol 傳輸控制協(xié)議
IP:Internet Protocol 互聯網協(xié)議
3、TCP/IP五層模型
應用層:HTTP、FTP、SMTP、Telnet等
傳輸層:TCP/IP
網絡層:
數據鏈路層:
物理層:網線、雙絞線、網卡等
4、IP地址
為實現網絡中不同計算機之間的通信,每臺計算機都必須有一個唯一的標識---IP地址。
32位二進制
5、端口
區(qū)分一臺主機的多個不同應用程序,端口號范圍為0-65535,其中0-1023位為系統(tǒng)保留。
如: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:統(tǒng)一資源定位符,通過URL可以直接讀取或寫入網絡上的數據
Sockets:使用TCP協(xié)議實現的網絡通信Socket相關的類
Datagram:使用UDP協(xié)議,將數據保存在用戶數據報中,通過網絡進行通信。
二、InetAddress
InetAddress類用于標識網絡上的硬件資源,標識互聯網協(xié)議(IP)地址。
該類沒有構造方法
三、URL類
1、URL(Uniform Resource Locator)統(tǒng)一資源定位符,表示Internet上某一資源的地址,協(xié)議名:資源名稱
2、使用URL讀取網頁內容
通過URL對象的openStream()方法可以得到指定資源的輸入流,通過流能夠讀取或訪問網頁上的資源
四、TCP編程
1、TCP協(xié)議是面向連接的、可靠的、有序的、以字節(jié)流的方式發(fā)送數據,通過三次握手方式建立連接,形成傳輸數據的通道,在連接中進行大量數據的傳輸,效率會稍低
2、Java中基于TCP協(xié)議實現網絡通信的類
客戶端的Socket類
服務器端的ServerSocket類
3、Socket通信的步驟
① 創(chuàng)建ServerSocket和Socket
?、?打開連接到Socket的輸入/輸出流
③ 按照協(xié)議對Socket進行讀/寫操作
?、?關閉輸入輸出流、關閉Socket
4、服務器端:
?、?創(chuàng)建ServerSocket對象,綁定監(jiān)聽端口
?、?通過accept()方法監(jiān)聽客戶端請求
?、?連接建立后,通過輸入流讀取客戶端發(fā)送的請求信息
?、?通過輸出流向客戶端發(fā)送鄉(xiāng)音信息
?、?關閉相關資源
6、應用多線程實現服務器與多客戶端之間的通信
① 服務器端創(chuàng)建ServerSocket,循環(huán)調用accept()等待客戶端連接
?、?客戶端創(chuàng)建一個socket并請求和服務器端連接
③ 服務器端接受苦讀段請求,創(chuàng)建socket與該客戶建立專線連接
?、?建立連接的兩個socket在一個單獨的線程上對話
?、?服務器端繼續(xù)等待新的連接
五、UDP編程
UDP協(xié)議(用戶數據報協(xié)議)是無連接的、不可靠的、無序的,速度快
進行數據傳輸時,首先將要傳輸的數據定義成數據報(Datagram),大小限制在64k,在數據報中指明數據索要達到的Socket(主機地址和端口號),然后再將數據報發(fā)送出去
DatagramPacket類:表示數據報包
DatagramSocket類:進行端到端通信的類
1、服務器端實現步驟
?、?創(chuàng)建DatagramSocket,指定端口號
?、?創(chuàng)建DatagramPacket
③ 接受客戶端發(fā)送的數據信息
?、?讀取數據
2、客戶端實現步驟
?、?定義發(fā)送信息
?、?創(chuàng)建DatagramPacket,包含將要發(fā)送的信息
?、?創(chuàng)建DatagramSocket
?、?發(fā)送數據
六、注意問題:
1、多線程的優(yōu)先級問題:
根據實際的經驗,適當的降低優(yōu)先級,否側可能會有程序運行效率低的情況
2、是否關閉輸出流和輸入流:
對于同一個socket,如果關閉了輸出流,則與該輸出流關聯的socket也會被關閉,所以一般不用關閉流,直接關閉socket即可
3、使用TCP通信傳輸對象,IO中序列化部分
4、socket編程傳遞文件,IO流部分
評論