1. 程式人生 > 其它 >JAVA--------簡單的網路通訊實現(教程)

JAVA--------簡單的網路通訊實現(教程)

技術標籤:JAVAjava

關於網路通訊流程的大概描述
在這裡插入圖片描述
客戶機請求連線伺服器,連線成功後,雙方便可開始互相傳送訊息,讀取訊息。

思路
這裡的網路通訊需要兩個大的東西,客戶機和伺服器,那麼圍繞這兩個來即可。
一、伺服器方面
1.建立好伺服器,通過一行ServerSocket來實現
2.需要響應客戶機的請求,使用Socket來建立連線
3.建立I/O流來輸出伺服器資料,接受客戶機發送的資料。
4.關閉各種資訊流,關閉網路連線。就像打電話總有會結束通話的時候。

二、客戶機方面
1.建立Socket連線通訊伺服器,同時要對應好伺服器的IP地址和埠(port),相當於打電話的時候要輸對電話號碼。

2.建立I/O流來輸出客戶機資料,接收伺服器傳送的資料。
3.關閉各種資訊流,關閉網路連線。

搭建伺服器和連線幾行程式碼即可實現,主要涉及的操作,是對於傳送讀取資料的處理。下面我來實現一個傳送字串的通訊,以此來展示一個簡單的通訊過程。

程式碼
我們首先需要建立伺服器,啟動專案的時候,也需要先啟動伺服器。總不能讓我們的客戶機連進一個不存在的東西里吧?

Admin.java

public class Admin {

	public void Begin(int port) {
		
		//首先需要建立一個伺服器
		try {
			//使用需要捕獲異常,因為可能會存在無法連線的情況
			ServerSocket my =
new ServerSocket(port); //測試語句 System.out.println("本地伺服器已建立"); //等待與客戶機連線 Socket admin = my.accept(); System.out.println("已收到客戶機請求"); //輸入流,讀取資料用的 InputStream read = admin.getInputStream(); BufferedReader tr = new BufferedReader(new InputStreamReader
(read)); //輸出流,傳送資料用的 OutputStream out = admin.getOutputStream(); PrintWriter th = new PrintWriter(out); //讀取客戶機發送來的訊息,設定判斷,只有客戶機有傳送訊息才做輸出語句 String adm; while(!((adm = tr.readLine()) == null)) { System.out.println("收到客戶機訊息:"+adm); } //給客戶機發送一段訊息 String word = "Welcome to my world!"; //輸出這段訊息 th.write(word); th.flush(); //關閉輸入輸出流 read.close(); tr.close(); out.close(); th.close(); //結束連線 admin.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { Admin ds=new Admin(); ds.Begin(8547); } }

在測試過程中,我們可以新增各種輸出語句來驗證連線是否成功,程式碼是否正常執行。只要輸出語句能夠顯現,那便能證明,輸出語句之上的程式碼都正常運行了。

之後,便是建立客戶機,過程和伺服器差不多,只要注意輸入對應的IP地址和埠即可。
1.”127.0.0.1“這個是機器自己的一個IP地址,每臺電腦都可以使用
2.我的伺服器Admin寫的埠是8547,所以接下來的客戶機連入的埠,也要使用8547.

User.java

public class User {

	public void Server() {
		
		//首先需要建立一個客戶端(客戶機),同樣需要捕獲異常
		try {
		//連線到伺服器
		Socket client = new Socket("127.0.0.1",8547);
		System.out.println("客戶端連入伺服器");
		
		//建立輸入流
		InputStream read = client.getInputStream();
		BufferedReader tr = new BufferedReader(new InputStreamReader(read));
		
		//建立輸出流
		OutputStream out = client.getOutputStream();
		PrintWriter th = new PrintWriter(out);
			
		//讓客戶機輸出一段字元
		String wd = "申請進入伺服器";
		
		//輸出這段話
		th.write(wd);
		th.flush();

        //關閉輸出,不再輸出更多資料,如果不關閉,就會出現伺服器無法判斷客戶機何時會結束髮送訊息,從而無法進行迴應。就和一個人和你打電話的時候一直在說話,你無法在這段時間如回覆他。
		client.shutdownOutput();
		
		//建立一個字串用來儲存伺服器傳送來的訊息
		String str ;
		
		//當伺服器有訊息傳送過來才執行輸出
		while(!((str = tr.readLine()) == null)) {
			System.out.println("伺服器傳送了訊息:"+str);
		}
		
		//以上的輸入輸出I/O流開啟後都需要我們執行關閉程式碼
		out.close();
		th.close();
		read.close();
		tr.close();
		
		//最後關閉網路連線,就和打完電話之後要結束通話電話一樣
		client.close();
		
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
	
	public static void main(String[] args) {
		User God=new User();
		God.Server();
    }
	
}

執行結果就幾行文字,這裡就不上圖了
1.伺服器的測試臺結果:
本地伺服器已建立
(下面兩行,在啟動客戶機,正常連線後出現)
已收到客戶機請求
收到客戶機訊息:申請進入伺服器

2.客戶機的測試臺結果:
客戶端連入伺服器
伺服器傳送了訊息:Welcome to my world!

大部分時候,問題都是出現在I/O流的輸入輸出上,比如輸入型別錯誤,輸出沒有結束等等。當通訊連接出現各種問題時,不妨新增輸出語句來驗證。
最後,直接拿來用的話,有些類名會被紅色波浪線標註,涉及到不少包的匯入,實在不明白可以按照軟體提示來一件匯入即可。╮( ̄▽ ̄)