您好,登錄后才能下訂單哦!
如何理解Java Socket聊天程序核心代碼,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Java Socket聊天程序在編寫的時候需要我們注意很多的事情,本程序是基于Java Socket聊天程序,采用TCP傳輸協議,實現兩個人之間的信息交互。下面我們就詳細的向大家介紹這一程序。
在形成最終結果之前,我經歷了兩個過程程序,兩個過程均為半成品,他們反映了我整個課程設計中的思考過程,在一個較為系統思考過程后,socket思想一層一層加固,讓我映像很深刻,收獲很多。在此文檔中,我將演示我兩個過程程序的思考過程,然后對源代碼進行講解,但最終上傳的代碼為制成品。
在兩個過程程序中,TestServer1和TestClient1為***個過程,TestServer2和TestClient2為第二個過程,MySingleThreadServer1和MySingleThreadClient1為最終程序。其中,TestServer2和TestClient2實現了多線程,一個線程負責接收,另一個線程負責發送,MySingleThreadServer1和MySingleThreadClient1實現了基于GUI的聊天。控件并非像MFC那樣很容易就可以通過拖動組件實現,java是通過程序的編寫來實現,我采用awt組件編碼實現GUI,界面很簡單,但花了不少時間來布局。
核心代碼講解:
三個過程程序都牽涉了Java Socket聊天程序最核心的思想,以下為核心的講解。
1.服務器端
Java Socket服務器端需要引入兩個包,java.io包和java.net包,io包是解決輸入輸出流的問題,而net包包含了socket編程所需的API.服務器端首先要得到ServerSocket的對象,即ServerSocket ss = new ServerSocket(5555); 5555為服務器端的端口號。Socket s = ss.accept();服務器端Socket對象通過accept()方法開始監聽鏈接過來的客戶端信息。如果有客戶端有信息過來,則對象s調用輸入輸出流的方法,如s.getInputStream(),同時把得到的InputStream 封裝在DataInputStream當中,在客戶端與服務器端通信時,有可能兩端存在于不同的操作系統,封裝在DataInputStream可以很好的解決這個問題。
2.客戶端
其實客戶端代碼與服務器端大多類似,有一點顯著不同,在客戶端沒有ServerSocket類,即客戶端不用監聽任何鏈接,他只需要發送鏈接即可。Socket s = new Socket(String IPAddr,int port),IPAddr為服務器端的IP地址,port為服務器端的端口號即5555,由于本程序服務器端和客戶端在同一主機上,所以服務器端IP地址為127.0.0.1。通過IPAddr和port兩個參數就可以得到Java Socket聊天程序對象s,接下來的步驟就和服務器程序類似了。
對三個過程程序的詳解
Procedure1:服務器端核心代碼如下:
ServerSocket ss = new ServerSocket(5555);
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
InputStream is = s.getInputStream();
DataInputStream dis = new DataInputStream(is);
InputStreamReader isr = new InputStreamReader(System.in);
//重鍵盤讀入數據BufferedReader br = new BufferedReader(isr);
//把從鍵盤讀入的數據放入緩沖String info;
while(true){
info = dis.readUTF();
System.out.println("客戶端說:" + info);
if(info.equals("goodbye")){
break;
}
info = br.readLine();
dos.writeUTF(info);
System.out.println("服務器說:" + info);
if(info.equals("goodbye")){
break;
}
}
客戶端核心代碼如下:
Socket s = new Socket("127.0.0.1",5555); InputStream is = s.getInputStream(); DataInputStream dis = new DataInputStream(is); OutputStream os = s.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String info; while(true){ info = br.readLine(); System.out.println("客戶端說的是:" + info); dos.writeUTF(info); if(info.equals("goodbye")){ break; } info = dis.readUTF(); //阻塞函數 System.out.println("服務器端說的是:" + info); if(info.equals("goodbye")){ break; } }
服務器端和客戶端在while(true)循環處各不相同,服務器端是dis.readUTF(),必須首先讀取客戶端傳過來的信息,才能通過info = br.readLine();dos.writeUTF(info);從鍵盤中讀取信息再發送給客戶端。相反,客戶端必須首先通過br.readLine();讀取鍵盤信息,才能接收服務器發送來的信息。
思考1:這個簡易的聊天程序已經實現了服務器和客戶端的信息交互,但此時已經出現了一個必然出現的問題,比如拿服務器端來講,當服務器通過dos.writeUTF(info)發送消息給客戶端后,在while循環體內,他又要執行info = dis.readUTF()代碼,而readUTF()是一個阻塞函數,如果客戶端沒有發送過來,他就阻塞在那個地方,此時下面部分的代碼dos.writeUTF(info)就不能執行,即服務器端不能發送消息出去。
Java Socket聊天程序要怎樣解決這個問題呢?怎樣readUTF()阻塞的同時又可以writeUTF(info)發送出消息呢?顯然,一條路徑走不通時應該考慮走另一條路,于是,多線程在這里引入了。Procedure2就是這樣出來的。
關于如何理解Java Socket聊天程序核心代碼問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。