1. 程式人生 > >Java內容梳理(20)API學習(8)網路程式設計

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:

資料傳輸的可靠性較差

傳輸資料包時,不保證資料包的先後順序

丟包嚴重:不保證每個資料包都能到達目標端

主要運用在組播:

電子教室

直播軟體