日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

socket(java) 搭建一个多人在线聊天室

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 socket(java) 搭建一个多人在线聊天室 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

      • 說明
      • Socket及java編程方法
      • 功能結構
          • 共享類
          • 服務器端
          • 客戶端
      • 效果展示
      • 代碼



說明

今年由于疫情原因只能在家里學習,今年學校有一門很重要的課程《面向對象》,學習了java中的編程思想、多線程、JML、UML等等東西,為了檢驗自己學習得好不好,再加上聽說 java 很適合 socket 編程,并且阿里云的服務器一年才九十多塊錢,我就決定(其實以上都不是主要原因,主要原因就是考完試在家閑的發(fā)慌)決定搭建一個多人在線聊天室,并且從中也可以學習 Swing、socket 等等。

后面代碼中所有GUI界面布局的內容,參見我之前的一篇博客 Swing的簡要學習記錄 。

本次實現(xiàn)的聊天室功能比較簡單,主要實現(xiàn)的功能如下:

  • 帶有優(yōu)美的 GUI界面(才怪);
  • 在服務器允許的壓力下支持多人實時聊天;
  • 支持賬戶登錄功能(不支持注冊功能,也就是服務器端預先設好了賬號)

以下是或許下一次要改進的內容:

  • 實現(xiàn)注冊功能;
  • 實現(xiàn)單人聊天;
  • 實現(xiàn)好友功能


Socket及java編程方法

socket(套接字)是計算機之間進行通信的一種約定。如果學過操作系統(tǒng)應該會知道,進程之間的通信(IPC)包括管道、FIFO、共享內存、信號量機制等等,這里socket就是一種可用于不同計算機的進程之間的通信機制,用來解決網絡通信問題。

socket的通信基于TCP/IP協(xié)議,用(ip地址,協(xié)議,端口號)唯一標識某一個主機中的某一個進程,socket通信的數(shù)據傳輸方式包括兩種:SOCK_STREAM(流套接字,基于TCP協(xié)議,特點是不易出錯)和SOCK_DGRAM(數(shù)據報套接字,基于UDP協(xié)議,特點是速度快)。java中的socket編程應該主要是基于TCP協(xié)議的。TCP連接時有什么三次握手建立連接(connect)、四次握手斷開連接(close),這些說實話具體過程我都不了解。

我只知道 java 中應該怎么寫(注意里面的Macro是我自己定義的一個類,可以忽略):

  • 服務器端:
// 建立socket服務 ServerSocket serverSocket = new ServerSocket(Macro.port); // 這句話的意思是,一直等待客戶端連接,一旦連接成功就返回一個socket Socket socket = serverSocket.accept();

主要的socket連接建立其實就這兩個,一般實現(xiàn)時會每當有客戶端連接時,新建一個線程去處理。

  • 客戶端:
// 建立一個與serverIP服務器,port端口的socket連接 try {socket = new Socket(Macro.serverIp, Macro.port); } catch (Exception e) {e.printStackTrace(); }

就這樣服務器和客戶端的socket連接就如此方便地建立好了!

  • 常用文件流:
BufferedReader bufferedReader = null; // 這個是socket中的輸入流 PrintWriter printWriter = null; // 這個是socket中的輸出流 try {bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); } catch (Exception e) {e.printStackTrace(); }

這些文件流跟本地的標準輸入輸出以及文件操作其實差不多,就是寫入讀出這些操作。

然后就可以服務器和客戶端就可以通過這兩個流進行通信了。



功能結構

共享類

這是服務器和客戶端共享的類,這些類不管在打包服務器的jar或者客戶端的jar時都應該包括在內,這些類包括Macro和Message,前者定義了一些通信中encode和decode的規(guī)則,以及服務器ip、端口號等等,后者用于雙方發(fā)送消息的載體。

  • Macro類:定義通信規(guī)則(包括對LOGIN請求的加密和解密、LOGOUT請求的加密和解密、MESSAGE的加密和解密、登錄是否成功信號的定義)、服務器相關信息、一些信號的宏定義等等;
  • Message類:定義了用戶發(fā)送的一個message需要包含的信息,有:發(fā)送者、發(fā)送時間、發(fā)送內容。
服務器端

服務器端處理用戶登錄登出請求、維護當前登錄狀態(tài)、維護用戶賬號密碼信息、處理message發(fā)送請求,并且要支持多用戶服務,主要包含的類如下:

  • server類:一直運行,初始加載Info類和MessageSend類,并且一直調用serverSocket.accept()進行socket連接監(jiān)聽,一但有socket連接成功,新建一個serverThread線程進行socket通信。
  • serverThread類:這個類與Info類和MessageSend類有關聯(lián)關系,用于與socket通信。這個類需要一直讀入用戶請求,并且支持三種請求:
    • LOGIN請求:通過Info類判斷該用戶是否合法,密碼是否正確,如果正確就在MessageSend中設定該用戶在線,并且通過socket返回登錄成功信號;
    • LOGOUT請求:直接在MessageSend中設定該用戶注銷(不在線);
    • MESSAGE請求:MessageSend中調用函數(shù),給所有在線用戶發(fā)送該message。
  • Info類:記錄用戶賬號密碼信息,提供賬號密碼是否正確的服務。
  • MessageSend類:記錄在線用戶(username)以及與他們socket通信中的PrintWriter,實現(xiàn)發(fā)送Message的功能。
客戶端

客戶端用于用戶登錄以及聊天,主要實現(xiàn)了兩個GUI界面(登錄界面和聊天界面),包括的類如下:

  • Client類:調用登錄界面。
  • Login類:實現(xiàn)登錄界面的JFrame,與服務器建立連接,每當進行登錄操作時向服務器發(fā)送登錄請求,然后讀取登錄是否成功的信息,如果成功調用Dialog類運行并且向之傳送socket信息,然后銷毀自己。
  • Dialog類:實現(xiàn)聊天界面的JFrame,通過socket與服務器通信,每當進行發(fā)送操作時,打包輸入框中的文字為Message,然后發(fā)送給服務器。并且一直讀入服務器傳來的數(shù)據,進行decode然后顯示在聊天框中。還要對窗體的關閉鍵進行監(jiān)聽,關閉窗體時向服務器發(fā)送LOGOUT請求,并且關閉當前的socket,然后銷毀自己。


效果展示



代碼

詳細的代碼和運行方法,參見 這里 。

總結

以上是生活随笔為你收集整理的socket(java) 搭建一个多人在线聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。