一、文檔適用對象
本文檔不適用於較爲基礎的學習,主要面向需要提交類似要求的課程作業的同學,本文主要介紹我的系統操作流程,文章最後附源代碼。
基於Java語言,實現了TCP協議下的QQ聊天和文件傳輸,主要涉及兩個原理:
1. Socket編程實現客戶端和服務器之間傳遞消息
2. 文件傳輸
二、實現的功能
- 服務器和客戶端一對一聊天
- 用戶和用戶一對一聊天
- 用戶對外羣發消息
- 服務器對外羣發消息
- 服務器向用戶一對一傳輸文件
- 可視化界面
三、源工程文件介紹
(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