Java實現基於TCP協議(Socket編程)的QQ聊天和文件傳輸

一、文檔適用對象

本文檔不適用於較爲基礎的學習,主要面向需要提交類似要求的課程作業的同學,本文主要介紹我的系統操作流程,文章最後附源代碼。

基於Java語言,實現了TCP協議下的QQ聊天和文件傳輸,主要涉及兩個原理:

1. Socket編程實現客戶端和服務器之間傳遞消息

Java 網絡編程 之 socket 的用法與實現

2. 文件傳輸

java模擬TCP通信--實現客戶端上傳文件到服務器端

二、實現的功能

  • 服務器和客戶端一對一聊天
  • 用戶和用戶一對一聊天
  • 用戶對外羣發消息
  • 服務器對外羣發消息
  • 服務器向用戶一對一傳輸文件
  • 可視化界面

三、源工程文件介紹

(1)Client和Server是用來展示的文件。

(2)TCPClient和TCPServer是用來驗證文件傳輸功能的文件。

(3)1.txt和timg.jpg是用來傳輸的文件。

四、操作介紹

4.1 服務器和客戶端一對一聊天

(1)點擊Server類,運行服務器端開始工作。

點擊Client類,客戶端開始工作。

服務器端提示Client 0上線了。

客戶端提示:Hello,Clent 0,表示當前用戶名稱是Client 0。

服務器端點擊右側Client 0按鈕,即可開始對Client 0一對一聊天,在聊天框輸入信息點擊發送即可。

4.2 用戶和用戶一對一聊天

在4.1的基礎上,繼續點擊Client類運行,此時出現第二個客戶端,提示Hello,Client 1!表示第二個客戶端的名字叫Client 1。

在客戶端界面點擊名稱即可與其一對一聊天,再次點擊名稱即可退出一對一聊天。

4.3 用戶對外羣發消息

在客戶端界面,直接輸入要發送的文字,然後點擊發送即可對所有用戶發送消息。

4.4 服務器對外羣發消息

與客戶端一樣,服務器退出一對一聊天后,即可對外羣發消息。

4.5 服務器向用戶一對一發送文件

發送文件通過“sendFile:文件路徑名”觸發,如在服務端輸入“sendFile:C:/temp/1.jpg”即可發送位於該位置的文件。

發送文件前需要先進入一對一聊天模式,以發送給Client 0爲例。

(1)先點擊服務器端界面右上角Client 0按鈕,進入與Client 0的一對一聊天模式。

(2)再在聊天框中輸入"sendFIle:timg.jpg",表示將當前目錄下的timg.jpg文件發送給Client 0。

此時在文件夾下會自動生成名爲"uploadAt1573889120143.jpg"的文件,此文件爲接收到的文件。

【注意】由於代碼缺陷,發送給Client 0以後,就不能再繼續發送新的消息,因爲客戶端接收文件的輸入流一直不能關閉,後續向Client 0發送文件或者消息,均會寫入客戶端創建的文件中。

//根據接收的信息獲取文件後綴
String suffix = receivedMessage.substring(receivedMessage.lastIndexOf("."));
    
//創建服務器端輸出流,從而把從客戶端獲得的文件保存到服務器本地,並且重新命名
FileOutputStream fos=new FileOutputStream("uploadAt"+System.currentTimeMillis() + suffix);

//獲取網絡輸出字節流,從而向客戶端發送數據
InputStream inputStream = s.getInputStream();

int len=0;
byte[] bytes=new byte[1024]; 

/*
下面的循環會一直接收信息到文件中,即使第一次文件傳輸結束了,但是該循環不能退出
後續傳過來的輸入都會寫入第一次的文件
*/
while ((len=inputStream.read(bytes))!=-1){
    //保存收到的文件
    fos.write(bytes,0,len);
}

4.6 可視化界面

客戶端可以看到消息記錄和當前在線用戶,服務器端可以監視每一條傳輸的信息和用戶在線狀態。

 

代碼鏈接:

https://download.csdn.net/download/DebugMakesMeHappy/11976336

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章