Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输

一、文档适用对象

本文档不适用于较为基础的学习,主要面向需要提交类似要求的课程作业的同学,本文主要介绍我的系统操作流程,文章最后附源代码。

基于Java语言,实现了TCP协议下的QQ聊天和文件传输,主要涉及两个原理:

1. Socket编程实现客户端和服务器之间传递消息

Java 网络编程 之 socket 的用法与实现

2. 文件传输

java模拟TCP通信--实现客户端上传文件到服务器端

二、实现的功能

  • 服务器和客户端一对一聊天
  • 用户和用户一对一聊天
  • 用户对外群发消息
  • 服务器对外群发消息
  • 服务器向用户一对一传输文件
  • 可视化界面

三、源工程文件介绍

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第1张图片

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

(2)TCPClient和TCPServer是用来验证文件传输功能的文件。

(3)1.txt和timg.jpg是用来传输的文件。

四、操作介绍

4.1 服务器和客户端一对一聊天

(1)点击Server类,运行服务器端开始工作。

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第2张图片

点击Client类,客户端开始工作。

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第3张图片

服务器端提示Client 0上线了。

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第4张图片

客户端提示:Hello,Clent 0,表示当前用户名称是Client 0。

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第5张图片

服务器端点击右侧Client 0按钮,即可开始对Client 0一对一聊天,在聊天框输入信息点击发送即可。

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第6张图片

4.2 用户和用户一对一聊天

在4.1的基础上,继续点击Client类运行,此时出现第二个客户端,提示Hello,Client 1!表示第二个客户端的名字叫Client 1。

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第7张图片

在客户端界面点击名称即可与其一对一聊天,再次点击名称即可退出一对一聊天。

4.3 用户对外群发消息

在客户端界面,直接输入要发送的文字,然后点击发送即可对所有用户发送消息。

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第8张图片

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。

Java实现基于TCP协议(Socket编程)的QQ聊天和文件传输_第9张图片

此时在文件夹下会自动生成名为"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

你可能感兴趣的:(Java)