成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java Socket聊天程序核心代碼講解

開發(fā) 后端
Java Socket聊天程序很多人都在使用,很多程序員都在進行這一程序的編寫,但是如何才能避免一些錯誤的出現(xiàn)呢?下面的文章會向大家有所介紹。

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

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

在兩個過程程序中,TestServer1和TestClient1為***個過程,TestServer2和TestClient2為第二個過程,MySingleThreadServer1和MySingleThreadClient1為最終程序。其中,TestServer2和TestClient2實現(xiàn)了多線程,一個線程負責接收,另一個線程負責發(fā)送,MySingleThreadServer1和MySingleThreadClient1實現(xiàn)了基于GUI的聊天。控件并非像MFC那樣很容易就可以通過拖動組件實現(xiàn),java是通過程序的編寫來實現(xiàn),我采用awt組件編碼實現(xiàn)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()方法開始監(jiān)聽鏈接過來的客戶端信息。如果有客戶端有信息過來,則對象s調用輸入輸出流的方法,如s.getInputStream(),同時把得到的InputStream 封裝在DataInputStream當中,在客戶端與服務器端通信時,有可能兩端存在于不同的操作系統(tǒng),封裝在DataInputStream可以很好的解決這個問題。

2.客戶端

其實客戶端代碼與服務器端大多類似,有一點顯著不同,在客戶端沒有ServerSocket類,即客戶端不用監(jiān)聽任何鏈接,他只需要發(fā)送鏈接即可。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. }  

客戶端核心代碼如下:

  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("客戶端說的是:" + info);  
  12. dos.writeUTF(info);  
  13. if(info.equals("goodbye")){  
  14. break;  
  15. }  
  16. info = dis.readUTF(); //阻塞函數  
  17. System.out.println("服務器端說的是:" + info);  
  18. if(info.equals("goodbye")){  
  19. break;  
  20. }  

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

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

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

責任編輯:張浩 來源: TT網絡
相關推薦

2012-02-15 13:19:04

JavaJava Socket

2014-04-01 11:02:00

Node.jsWeb Socket聊天程序

2009-09-28 11:30:53

Hibernate核心

2010-07-13 09:29:37

socketUDP協(xié)議

2010-03-17 14:22:40

Java Socket

2010-03-22 13:25:47

Java Socket

2010-01-22 14:07:23

網絡核心交換機

2010-02-07 14:16:57

2010-06-29 12:42:05

UDP協(xié)議Java

2010-03-19 15:02:50

Java Socket

2009-10-26 11:04:36

VB.NET UDP協(xié)

2017-02-08 13:03:40

Java線程池框架

2010-03-19 16:51:53

Java Socket

2009-12-07 11:19:39

WCF聊天

2010-03-18 16:49:43

Java Socket

2019-12-31 20:55:13

Socket通信TCP

2010-01-28 16:01:18

Android Jni

2009-09-24 13:22:58

Nhibernate代碼生成

2010-03-02 14:46:03

Android核心系統(tǒng)

2021-09-05 07:55:36

Lsm核心實現(xiàn)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线免费观看 | 日日噜噜夜夜爽爽狠狠 | 五月婷婷中文 | 亚洲色图在线观看 | 日韩精品一区二区三区中文在线 | 日韩二区| 国产一区二区三区在线看 | 中文字幕在线观看成人 | 在线观看国产视频 | 国产日韩一区二区三免费高清 | 欧美精品久久久久 | 日韩中文字幕在线免费 | 超碰97免费观看 | 亚洲欧美v | 精品一区二区不卡 | 色在线免费视频 | 国产成人自拍一区 | 国产在线观看一区二区 | 91精品国产91久久久久久最新 | 91亚洲国产精品 | 精品国产一区二区三区在线观看 | 一区二区三区国产 | 亚洲精品电影网在线观看 | 日韩www | av电影一区二区 | 91亚洲精选| 一区二区三区视频在线观看 | 久久久久国产 | 嫩草影院网址 | 日韩精品网站 | 国产精品成人久久久久 | 久色激情 | 国产在线视频在线观看 | 国产美女精品 | 亚洲综合区| 成人欧美一区二区三区在线播放 | 岛国午夜| 中文字幕久久精品 | 日韩一区二区三区在线看 | 超碰一区二区 | 亚洲va中文字幕 |