一、文档适用对象
本文档不适用于较为基础的学习,主要面向需要提交类似要求的课程作业的同学,本文主要介绍我的系统操作流程,文章最后附源代码。
基于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