日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java Socket聊天程序核心代碼講解

Java Socket聊天程序在編寫(xiě)的時(shí)候需要我們注意很多的事情,本程序是基于Java Socket聊天程序,采用TCP傳輸協(xié)議,實(shí)現(xiàn)兩個(gè)人之間的信息交互。下面我們就詳細(xì)的向大家介紹這一程序。#t#

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站建設(shè)、做網(wǎng)站與策劃設(shè)計(jì),河間網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:河間等地區(qū)。河間做網(wǎng)站價(jià)格咨詢:13518219792

在形成最終結(jié)果之前,我經(jīng)歷了兩個(gè)過(guò)程程序,兩個(gè)過(guò)程均為半成品,他們反映了我整個(gè)課程設(shè)計(jì)中的思考過(guò)程,在一個(gè)較為系統(tǒng)思考過(guò)程后,socket思想一層一層加固,讓我映像很深刻,收獲很多。在此文檔中,我將演示我兩個(gè)過(guò)程程序的思考過(guò)程,然后對(duì)源代碼進(jìn)行講解,但最終上傳的代碼為制成品。

在兩個(gè)過(guò)程程序中,TestServer1和TestClient1為***個(gè)過(guò)程,TestServer2和TestClient2為第二個(gè)過(guò)程,MySingleThreadServer1和MySingleThreadClient1為最終程序。其中,TestServer2和TestClient2實(shí)現(xiàn)了多線程,一個(gè)線程負(fù)責(zé)接收,另一個(gè)線程負(fù)責(zé)發(fā)送,MySingleThreadServer1和MySingleThreadClient1實(shí)現(xiàn)了基于GUI的聊天??丶⒎窍馦FC那樣很容易就可以通過(guò)拖動(dòng)組件實(shí)現(xiàn),java是通過(guò)程序的編寫(xiě)來(lái)實(shí)現(xiàn),我采用awt組件編碼實(shí)現(xiàn)GUI,界面很簡(jiǎn)單,但花了不少時(shí)間來(lái)布局。

核心代碼講解:

三個(gè)過(guò)程程序都牽涉了Java Socket聊天程序最核心的思想,以下為核心的講解。

1.服務(wù)器端

Java Socket服務(wù)器端需要引入兩個(gè)包,java.io包和java.net包,io包是解決輸入輸出流的問(wèn)題,而net包包含了socket編程所需的API.服務(wù)器端首先要得到ServerSocket的對(duì)象,即ServerSocket ss = new ServerSocket(5555); 5555為服務(wù)器端的端口號(hào)。Socket s = ss.accept();服務(wù)器端Socket對(duì)象通過(guò)accept()方法開(kāi)始監(jiān)聽(tīng)鏈接過(guò)來(lái)的客戶端信息。如果有客戶端有信息過(guò)來(lái),則對(duì)象s調(diào)用輸入輸出流的方法,如s.getInputStream(),同時(shí)把得到的InputStream 封裝在DataInputStream當(dāng)中,在客戶端與服務(wù)器端通信時(shí),有可能兩端存在于不同的操作系統(tǒng),封裝在DataInputStream可以很好的解決這個(gè)問(wèn)題。

2.客戶端

其實(shí)客戶端代碼與服務(wù)器端大多類似,有一點(diǎn)顯著不同,在客戶端沒(méi)有ServerSocket類,即客戶端不用監(jiān)聽(tīng)任何鏈接,他只需要發(fā)送鏈接即可。Socket s = new Socket(String IPAddr,int port),IPAddr為服務(wù)器端的IP地址,port為服務(wù)器端的端口號(hào)即5555,由于本程序服務(wù)器端和客戶端在同一主機(jī)上,所以服務(wù)器端IP地址為127.0.0.1。通過(guò)IPAddr和port兩個(gè)參數(shù)就可以得到Java Socket聊天程序?qū)ο髎,接下來(lái)的步驟就和服務(wù)器程序類似了。

對(duì)三個(gè)過(guò)程程序的詳解

Procedure1:服務(wù)器端核心代碼如下:

 
 
 
  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);
     //重鍵盤讀入數(shù)據(jù)  
  8. BufferedReader br = new BufferedReader(isr); 
    //把從鍵盤讀入的數(shù)據(jù)放入緩沖  
  9. String info;  
  10. while(true){  
  11. info = dis.readUTF();   
  12. System.out.println("客戶端說(shuō):" + info);  
  13. if(info.equals("goodbye")){  
  14. break;  
  15. }  
  16. info = br.readLine();  
  17. dos.writeUTF(info);  
  18. System.out.println("服務(wù)器說(shuō):" + info);  
  19. if(info.equals("goodbye")){  
  20. break;  
  21. }  

客戶端核心代碼如下:

 
 
 
  1. Socket s = new Socket("127.0.0.1",5555);  
  2. InputStream is = s.getInputStream();  
  3. DataInputStream dis = new DataInputStream(is);  
  4. OutputStream os = s.getOutputStream();  
  5. DataOutputStream dos = new DataOutputStream(os);  
  6. InputStreamReader isr = new InputStreamReader(System.in);   
  7. BufferedReader br = new BufferedReader(isr);  
  8. String info;  
  9. while(true){  
  10. info = br.readLine();  
  11. System.out.println("客戶端說(shuō)的是:" + info);  
  12. dos.writeUTF(info);  
  13. if(info.equals("goodbye")){  
  14. break;  
  15. }  
  16. info = dis.readUTF(); //阻塞函數(shù)  
  17. System.out.println("服務(wù)器端說(shuō)的是:" + info);  
  18. if(info.equals("goodbye")){  
  19. break;  
  20. }  

服務(wù)器端和客戶端在while(true)循環(huán)處各不相同,服務(wù)器端是dis.readUTF(),必須首先讀取客戶端傳過(guò)來(lái)的信息,才能通過(guò)info = br.readLine();dos.writeUTF(info);從鍵盤中讀取信息再發(fā)送給客戶端。相反,客戶端必須首先通過(guò)br.readLine();讀取鍵盤信息,才能接收服務(wù)器發(fā)送來(lái)的信息。

思考1:這個(gè)簡(jiǎn)易的聊天程序已經(jīng)實(shí)現(xiàn)了服務(wù)器和客戶端的信息交互,但此時(shí)已經(jīng)出現(xiàn)了一個(gè)必然出現(xiàn)的問(wèn)題,比如拿服務(wù)器端來(lái)講,當(dāng)服務(wù)器通過(guò)dos.writeUTF(info)發(fā)送消息給客戶端后,在while循環(huán)體內(nèi),他又要執(zhí)行info = dis.readUTF()代碼,而readUTF()是一個(gè)阻塞函數(shù),如果客戶端沒(méi)有發(fā)送過(guò)來(lái),他就阻塞在那個(gè)地方,此時(shí)下面部分的代碼dos.writeUTF(info)就不能執(zhí)行,即服務(wù)器端不能發(fā)送消息出去。

Java Socket聊天程序要怎樣解決這個(gè)問(wèn)題呢?怎樣readUTF()阻塞的同時(shí)又可以writeUTF(info)發(fā)送出消息呢?顯然,一條路徑走不通時(shí)應(yīng)該考慮走另一條路,于是,多線程在這里引入了。Procedure2就是這樣出來(lái)的。


標(biāo)題名稱:Java Socket聊天程序核心代碼講解
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/djcdjsg.html