四層機構:物理層、網絡層、傳輸層、應用層
協議:IP、TCP、UDP、HTTP、FTP、SMTP等
TCP:面向連接的服務。可靠,傳輸大小無限制,但是需要連接建立時間,差錯控制開銷大。
比如打電話
UDP,無連接的服務。不可靠,差錯控制開銷較小,傳輸大小限制在64K以下,不需要建立連接。
比如寫信
Socket(套接字)
Socket 是網絡上的兩個進程經過雙向的通信而建立起來的一個實現數據傳輸的通道,這個雙向鏈路的每一端都是一個Socket。
Socket由IP地址和端口號組成
IP地址:定位到網絡中的一臺PC
端口號:定位到PC中的一個進程
疑問:
開發者基於TCP協議的網絡編程,
是否四層中所有細節都需涉及到呢?
答:
不需要
Java語言是目前最受歡迎的網絡編程語言之一,
使用它能夠輕鬆實現網絡編程,只需涉及傳輸層。
Java網絡編程涉及到的package: java.net
InetAddress類
URL類
URLConnection類
套接字類
Socket 類
ServerSocket類
DatagramPacket類
Java網絡編程涉及到的package: java.io
InputStream/OutputStream
BufferedInputStream/BufferedOutputStream
DataInputStream/DataOutputStream
BufferedReader/PrintWriter
ObjectInputStream/ObjectOutputStream
Java網絡編程涉及到的package: java.lang
Thread
Runnable
InetAddress:描述Internet地址的類
常用方法:
static InetAddress getLocalHost();返回本地主機
static InetAddress getByName(String host) 給定主機名,確定主機IP地址
String getHostAddress(); 返回主機IP地址
String getHostName(); 獲得主機名
java.net.URL:
URL類代表一個統一資源定位器,一個萬維網中的“資源”
一個URL的格式
通信協議://主機:端口/文件
URL(String spec)
方法
openStream()
openConnection()
java.net.URLConnection:
它代表應用程序和 URL 之間的通信鏈接
此類的實例可用於讀取此 URL 引用的資源
構造函數
URLConnection(URL)
方法
connect()
getInputStream()
URL和URLConnection類封裝的從遠程站點檢索信息的複雜性
支持HTTP資源
URL url = new URL(“http://www.gem-inno.com”)
打開一個URL連接
URLConnection urlconn = url.openConnection()
只需打開一個輸入流
InputStream in = url.openStream()
Socket:(套接字)
兩個網絡進程採用套接字方式通信(基於TCP協議)時,因扮演的角色不同,它們使用的套接字也不同。
客戶端Socket和服務器端ServerSocket
Socket :
構造方法:
Socket(String host, int port)
Socket(InetAddress address, int port)
Socket類提供的主要方法有:
InetAddress getInetAddress()
int getPort()
void close()
InputStream getInputStream()
OutputStream getOutputStream()
ServerSocket :
構造方法:
ServerSocket(int port)
ServerSocket(int port,int count)
Socket類提供的主要方法有:
Socket accept() throws IOException
void close()
服務器端代碼:
客戶端代碼:
服務端Socket流程:
1.創建一個服務器套接字
2.接受一個連接來自客戶機的請求,並返回一個新的套接字
3.從套接字上獲得輸入流/輸出流
4.使用數據包裝流
從流中接收/發送信息
釋放資源
客戶端Socket流程:
1.創建一個套接字
2.從套接字上獲得輸入流和/或輸出流
3.使用數據包裝流(可選)
4.從流中接收/發送信息
釋放資源
處理併發連接:
一個服務端需要處理多個客戶端的連接請求,
使用多線程技術可以解決此類問題。
每當請求到達時,服務器新建一個線程來爲這個請求服務。
服務端代碼 – 多線程
線程實現類:
客戶端代碼: