網(wǎng)絡(luò)編程主要問題
- 如何準(zhǔn)確的定位網(wǎng)絡(luò)上一臺或多臺主機(jī)
-
找到主機(jī)后如何可靠高效的進(jìn)行數(shù)據(jù)傳輸
在TCP/IP協(xié)議中IP層主要負(fù)責(zé)網(wǎng)絡(luò)主機(jī)的定位,數(shù)據(jù)傳輸?shù)穆酚汕砬唬蒊P地址可以唯一地確定Internet上的一臺主機(jī)瑰枫。
而TCP層則提供面向應(yīng)用的可靠(tcp)的或非可靠(UDP)的數(shù)據(jù)傳輸機(jī)制,這是網(wǎng)絡(luò)編程的主要對象丹莲,一般不需要關(guān)心IP層是如何處理數(shù)據(jù)的光坝。
兩類傳輸協(xié)議:TCP剖毯;UDP
- TCP:面向連接的 安全的
- TCP是Tranfer Control Protocol的 簡稱,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議教馆。通過TCP協(xié)議傳輸逊谋,得到的是一個順序的無差錯的數(shù)據(jù)流。發(fā)送方和接收方的成對的兩個socket之間必須建 立連接土铺,以便在TCP協(xié)議的基礎(chǔ)上進(jìn)行通信胶滋,當(dāng)一個socket(通常都是server socket)等待建立連接時,另一個socket可以要求進(jìn)行連接悲敷,一旦這兩個socket連接起來究恤,它們就可以進(jìn)行雙向數(shù)據(jù)傳輸,雙方都可以進(jìn)行發(fā)送 或接收操作
- UDP:面向無連接的 不安全 但快
- UDP是User Datagram Protocol的簡稱后德,是一種無連接的協(xié)議部宿,每個數(shù)據(jù)報都是一個獨立的信息,包括完整的源地址或目的地址瓢湃,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地理张,因此能否到達(dá)目的地,到達(dá)目的地的時間以及內(nèi)容的正確性都是不能被保證的
基于Socket的java網(wǎng)絡(luò)編程
Socket類:客戶端
ServerSocket:服務(wù)器端
TCP通信中绵患,服務(wù)端與客戶端是一對多的關(guān)系
服務(wù)端與客戶端的關(guān)系.png
什么是Socket
- 網(wǎng)絡(luò)上的兩個程序通過一個雙向的通訊連接實現(xiàn)數(shù)據(jù)的交換雾叭,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現(xiàn)客戶方和服務(wù)方的連接落蝙。Socket是TCP/IP協(xié)議的一個十分流行的編程界面织狐,一個Socket由一個IP地址和一個端口號唯一確定
- 但是,Socket所支持的協(xié)議種類也不光TCP/IP一種筏勒,因此兩者之間是沒有必然聯(lián)系的移迫。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程
Socket通訊的過程
Server端Listen(監(jiān)聽)某個端口是否有連接請求管行,Client端向Server 端發(fā)出Connect(連接)請求厨埋,Server端向Client端發(fā)回Accept(接受)消息。一個連接就建立起來了病瞳。Server端和Client 端都可以通過Send揽咕,Write等方法與對方通信
對于一個功能齊全的Socket,都要包含以下基本結(jié)構(gòu)套菜,其工作過程包含以下四個基本的步驟:
- 創(chuàng)建Socket
- 打開連接到Socket的輸入/出流
- 按照一定的協(xié)議對Socket進(jìn)行讀/寫操作
- 關(guān)閉Socket
創(chuàng)建Socket
java在包java.net中提供了兩個類Socket和ServerSocket亲善,分別用來表示雙向連接的客戶端和服務(wù)端。這是兩個封裝得非常好的類逗柴,使用十分方便
- 注意蛹头,在選擇端口時,必須小心。每一個端口提供一種特定的服務(wù)渣蜗,只有給出正確的端口屠尊,才 能獲得相應(yīng)的服務(wù)。0~1023的端口號為系統(tǒng)所保留耕拷,例如http服務(wù)的端口號為80,telnet服務(wù)的端口號為23,ftp服務(wù)的端口號為21, 所以我們在選擇端口號時讼昆,最好選擇一個大于1023的數(shù)以防止發(fā)生沖突
- 在創(chuàng)建socket時如果發(fā)生錯誤,將產(chǎn)生
IOException
骚烧,在程序中必須對之作出處理浸赫。所以在創(chuàng)建Socket或ServerSocket是必須捕獲或拋出例外
數(shù)據(jù)輸出與讀取
數(shù)據(jù).png
demo.手動發(fā)送內(nèi)容并輸出
class MyClient{
public static void main(String[] args){
//連接服務(wù)器段的socket
Socket socket = null;
try {
socket = new Socket("10.129.12.158", 8888);
//接收服務(wù)器消息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
}catch (IOException e){
System.out.println("網(wǎng)絡(luò)出錯 請重新登錄");
}finally {
//關(guān)閉連接
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class MyServer{
public static void main(String[] args){
//創(chuàng)建ServerSocket
try {
ServerSocket ss = new ServerSocket(8888);
//監(jiān)聽客戶端的連接
Socket socket = ss.accept();
//從終端接收數(shù)據(jù)
BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
//獲取向客戶端輸出數(shù)據(jù)的輸出流
PrintStream ps = new PrintStream(socket.getOutputStream());
String line = null;
while ((line = keyin.readLine()) != null){
//發(fā)送給客戶端
ps.println(line);
}
//發(fā)送給客戶端
} catch (IOException e) {
e.printStackTrace();
}
}
}
PS.
慢慢我們學(xué)習(xí)的東西開始逐漸融合了,今天學(xué)習(xí)網(wǎng)絡(luò)用到了以前的多線程與I/O流等等赃绊,感覺到了吃力既峡,但也讓我能夠更清楚的了解到自己哪方面的不足,加上今天的四級成績有點身心俱疲的感覺碧查,不過還是要咬牙堅持运敢。我不希望以后某個時間點會后悔,因為讓我們后悔情緒的本質(zhì)是因為我們對自身實力過于高估從而不夠自律和努力造成的忠售,加油吧
開炮.jpg