JAVA--------簡單的網路通訊實現(教程)
關於網路通訊流程的大概描述
客戶機請求連線伺服器,連線成功後,雙方便可開始互相傳送訊息,讀取訊息。
思路
這裡的網路通訊需要兩個大的東西,客戶機和伺服器,那麼圍繞這兩個來即可。
一、伺服器方面
1.建立好伺服器,通過一行ServerSocket來實現
2.需要響應客戶機的請求,使用Socket來建立連線
3.建立I/O流來輸出伺服器資料,接受客戶機發送的資料。
4.關閉各種資訊流,關閉網路連線。就像打電話總有會結束通話的時候。
二、客戶機方面
1.建立Socket連線通訊伺服器,同時要對應好伺服器的IP地址和埠(port),相當於打電話的時候要輸對電話號碼。
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流的輸入輸出上,比如輸入型別錯誤,輸出沒有結束等等。當通訊連接出現各種問題時,不妨新增輸出語句來驗證。
最後,直接拿來用的話,有些類名會被紅色波浪線標註,涉及到不少包的匯入,實在不明白可以按照軟體提示來一件匯入即可。╮( ̄▽ ̄)