中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Java Socket聊天程序核心代碼

發布時間:2021-10-23 17:56:02 來源:億速云 閱讀:99 作者:柒染 欄目:編程語言

如何理解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:服務器端核心代碼如下:

  1. ServerSocket ss = new ServerSocket(5555);  

  2. Socket s = ss.accept();  

  3. OutputStream os = s.getOutputStream();  

  4. DataOutputStream dos = new DataOutputStream(os);  

  5. InputStream is = s.getInputStream();  

  6. DataInputStream dis = new DataInputStream(is);  

  7. InputStreamReader isr = new InputStreamReader(System.in);
     //重鍵盤讀入數據  

  8. BufferedReader br = new BufferedReader(isr); 
    //把從鍵盤讀入的數據放入緩沖  

  9. String info;  

  10. while(true){  

  11. info = dis.readUTF();   

  12. System.out.println("客戶端說:" + info);  

  13. if(info.equals("goodbye")){  

  14. break;  

  15. }  

  16. info = br.readLine();  

  17. dos.writeUTF(info);  

  18. System.out.println("服務器說:" + info);  

  19. if(info.equals("goodbye")){  

  20. break;  

  21. }  

客戶端核心代碼如下:

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聊天程序核心代碼問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河东区| 阿拉善盟| 浙江省| 和平县| 高安市| 鸡西市| 隆尧县| 雷波县| 长治县| 元朗区| 肇庆市| 沙雅县| 武穴市| 聂荣县| 邹城市| 和龙市| 西昌市| 宝鸡市| 韩城市| 越西县| 杭锦旗| 榆树市| 孝感市| 丰台区| 西贡区| 嘉定区| 门源| 抚顺市| 廊坊市| 吐鲁番市| 沙田区| 海南省| 泗水县| 乳源| 余江县| 永康市| 浪卡子县| 浦北县| 建平县| 新乡市| 贡嘎县|