Java內容梳理(20)API學習(8)網路程式設計
1、服務端和客戶端
服務端:主要用提供各種資源,各種功能,各種資料這類的遠端服務
客戶端:連線服務端從而從伺服器下載各種資源,使用各種功能的這種執行在本機上的程式,我們稱為客戶端
2、網路應用模型(C/S 和 B/S架構)
C/S架構:Client-Server
Client:特有的獨立的客戶端軟體, 通常由服務端開發公司所提供
優點:豐富的使用者體驗
缺點:客戶端部署和升級難度大
B/S架構:瀏覽器-Server
客戶端統一由瀏覽器充當
優點:客戶端部署和升級很容易
缺點:使用者體驗相對較差
3、Java實現C/S架構的網路程式(著重學習Server端)
1、Java中實現C/S架構的網路程式
Client:
Swing
JavaFx
Server:
Socket程式設計
Netty
2、Socket程式設計:
客戶端表示:java.net.Socket類(套接字)
服務端表示:java.net.ServerSocket類
ServerSocket:
ServerSocket(int port):建立一個連線服務,立刻去繫結指定的port埠,若繫結成功,就在OS上建立好了這個連線服務
注意: 指定的埠必須是空閒埠
ServerSocket();在記憶體中建立一個連線服務物件
當我們需要對服務進行一些配置設定時使用,當我們配置完後呼叫bind方法進行埠繫結,bind( SocketAddress sa ):
如:serverSocket.bind( new InetSocketAddress(8686) ); 正式在OS上建立連線服務
accpet()方法:等待一個客戶端連線, 它是一個阻塞方法
Socket:
Socket(String host, int port):建立一個連線物件,立刻去連線指定的host主機,通過port這個埠去連線
Socket():記憶體中建立一個連線物件,並沒有去連線任何主機
呼叫connect方法去正式連線一個主機connect(SocketAddress endpoint, int timeout):
去連線指定的主機,在沒有超過timeout時間內,不斷嘗試,直至超時;否則判定連線失敗
4、網路資料的收發
網路資料的收發:
步驟1: 從Socket連線中獲取IO流
步驟2: 利用IO流的API完成資料的傳遞
注意: BIO(OIO)這些流中的read相關方法都是阻塞方法,\當沒有讀到資料時,當前執行緒會一直阻塞,直到讀到資料後才恢復
package net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class NetDataServer {
public static void main(String[] args) {
try {
//建立服務端,繫結8686埠,讓客戶端連線
ServerSocket ss = new ServerSocket(8686);
//等待客戶端連線
Socket conn = ss.accept();
System.out.println("歡迎"+conn.getInetAddress().getHostAddress()+"訪問");
//----接收客戶端傳送的資料
//獲得連線的輸入流
InputStream is = conn.getInputStream();
//位元組輸入流轉換成字元輸入流
BufferedReader in = new BufferedReader(
new InputStreamReader(is)
);
//讀取客戶端的傳送的資訊
//只要客戶端通過writer流寫出資料,服務端就能通過reader流讀取到資料
//read方法都是阻塞方法
String msg = in.readLine();
System.out.println(msg);
//----傳送資料給客戶端
//獲得連線的輸出流
OutputStream os = conn.getOutputStream();
PrintWriter out = new PrintWriter(os);
out.println("服務端向客戶端傳送訊息:你好,客戶端");
//強制提交發送的資料
out.flush();
Thread.sleep(60*60*1000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
package net;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class NetDataClient {
public static void main(String[] args) {
try {
//建立客戶端連線服務,去連線服務端
Socket socket = new Socket("localhost",8686);
System.out.println("連線成功");
//---向服務端寫資料(傳送訊息)
OutputStream os = socket.getOutputStream();
PrintWriter out = new PrintWriter(os);
out.println("客戶端向服務端傳送訊息:你好,服務端");
out.flush();
//---接收服務端訊息
InputStream is = socket.getInputStream();
BufferedReader in = new BufferedReader(
new InputStreamReader(is)
);
String msg = in.readLine();
System.out.println(msg);
Thread.sleep(60*60*1000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
注意要先啟動服務端
5、網路通訊協議
網路通訊時採用的傳輸協議:
TCP:
資料的傳輸的可靠性高
按順序: 客戶端先發A,再發B,最後發C,伺服器接收資料時一定是先收到A,再收到B,最後收到C
保證傳輸到對應端點;對資料要求高可靠時
主要運用在單播:點對點的資料傳輸
Java實現:
Socket
ServerScoket
由TCP拓展的協議:HTTP/HTTPS
UDP:
資料傳輸的可靠性較差
傳輸資料包時,不保證資料包的先後順序
丟包嚴重:不保證每個資料包都能到達目標端
主要運用在組播:
電子教室
直播軟體