- 前言
- 资源链接
- Netbeans资源
- 程序资源
- 程序运行效果图
- 群聊和私聊
- 文件传输测试
- 语音通话功能
- 视频通话功能
- 远程控制及键盘记录功能
- 设计目的和需求分析
- 项目设计目的
- 项目需求分析
- 实现功能
- 分析设计
- 客户端的登入和退出
- 文本消息的传输
- 文件传输逻辑
- 语音通话逻辑分析
- 视频通话逻辑分析
- 远程控制逻辑分析
- 关键功能实现
- 消息类型声明
- 客户端登入和添加主机功能的实现
- 消息传输和抖动窗口的实现
- 语音通话的实现
- 视频通话的实现
- 远程控制和键盘监控的实现
- 后记
这是网络编程工程实训中所设计的P2P局域网通讯工具,没有服务端,主要用了Netbeans作为开发工具,最终实现了在局域网中的远程控制、文件传输、语言通话、视频通话和键盘监控的功能,代码改编自《Java网络编程案例教程-微课版》_董相志上课的例题,现将代码和大作业报告全部开源,仅供大家学习和参考
作为一个大作业报告,相关知识点的赘述可能较为繁琐,大家可以自行找到感兴趣的地方,希望能够有所帮助
资源链接 Netbeans资源有人住高楼,有人在深沟, 有人光万丈,有人一身锈, 世人万千种,浮云莫去求,斯人若彩虹,遇上方知有。
这里仅提供64位的软件安装环境,若需要其他环境可以自行到官网中下载
链接:https://pan.baidu.com/s/1ByOkC-ivLQixffK5p3DD9w
提取码:qwer
Netbeans官网
当时写代码的时候在多个代码文件中都留下了相关个人信息,由于有些时间了,部分代码已做处理,未处理的部分可能需要大家发掘一下
链接:https://pan.baidu.com/s/1jGogUofzhutyJuYueEbfEQ
提取码:qwer
说明:完整下载代码文件夹后在Netbeans中导入项目即可,项目文件夹中webcam-capture-0.3.10-dist目录为webcam第三方库,用于摄像头设备的调用,相关jar包在libs中也可以找到,若打开项目时题实webcam类找不到,需要重新导入libs目录下的三个jar包。
程序运行效果图就不按照大作业报告的顺序写了,先贴程序运行效果图吧
群聊和私聊首先我们分别在本地和两台虚拟机中启动程序:
可以看到,最先开启的物理机中收到了两台虚拟机中客户端的登入信息,在虚拟机中也收到了相应的登入信息。
接下来由10.0.0.1发送广播消息hello,观察两个客户端是否能够正确的接受消息
可以看到两台主机均正确收到了消息,接下来由主机10.0.0.1向10.0.0.139发送hello 139消息,观察两个客户端消息的接收状况
可以看到仅有10.0.0.139的主机收到了消息,其他主机没有收到,接下来退出10.0.0.141的客户端,继续下面的测试。
接下来由10.0.0.1的客户端向10.0.0.139的客户端发送文件:
可以看到主机10.0.0.139成功接收文件并将该文件存储到项目文件夹中。
接下来由10.0.0.1向10.0.0.139发起语言通话:
经过实际的麦克风语音测试,语言通话能够能够流程的实现客户端之间交换语音信息。
在测试视频通话时,由于物理机和虚拟机不可共用物理机上的摄像头,所以仅将win10物理机上捕获的视频信息传输到虚拟机中,这也证明了视频通话的发送和接受功能是有效的,若要在两台主机中均开启摄像头,需修改ReceiveMessage中接受语言通话调用的函数,修改为parentUI.startVideo(userId);函数即可在视频通信的双方均开启摄像头。
接下来由10.0.0.1向10.0.0.139发起视频通话
人脸部分已打码~
经过实际测试,视频通话功能能够在客户端之间正确的传输视频信息,视频播放较为流畅。
接下来由10.0.0.1向10.0.0.139发起远程控制:
可以看到客户端10.0.0.1通过远程控制窗口即可控制10.0.0.139的主机,此时开启客户端上的键盘记录功能,并通过控制窗口,在10.0.0.139的客户端发言窗口中输入this is control client信息
可以看到被控制客户端已经成功复现了控制命令,同时在控制端中可以看到相应的键盘记录情况
接下来是正常的大作业报告书的顺序了
项目设计目的本项目旨在通过结合上课所学的相关知识,深入学习网络编程相关知识,在锻炼自己运用所学知识解决实际问题的同时,也能够设计出一款基于P2P的通讯模式的、实用的多功能网络通讯工具,使自身的网络编程能力得到进一步的提高。
项目需求分析作为一款基于P2P模式,也就是没有服务端而仅有客户端的模式,针对局域网内主机通讯的通讯工具,首先需要满足最基础的通讯功能,即使得网络中的主机之间能够自动发现,并能够实现基础的文本信息传输功能。
在实现基础的文本信息传输功能的基础上,考虑到实际局域网中主机间进行通讯的需求,本项目所设计的通讯工具还应该实现较为可靠的传递文件数据的功能。
与此同时,为了满足不同用户对于通讯的需求,本项目所设计的通讯工具还应该提供例如语音通话、视频通话等多媒体的通讯方式,并基本保障语音数据、视频数据传输的稳定性。
不仅如此,为了进一步丰富软件的功能,该通讯工具还应该提供屏幕监控、远程监控、键盘记录等功能,真正的做到多功能的网络通讯工具。
根据上面的项目设计目的和需求分析,结合本项目所采用的p2p架构,我将在本项目所开发的软件中实现如下的功能:
1.主机的自主发现和广播登入功能
2.群聊和私聊的功能
3.文本信息传输功能
4.文件数据传输功能
5.语言通话功能
6.视频通话功能
7.屏幕监控、远程控制功能
8.键盘记录功能
9.抖动窗口功能
这一部分是设计思路实现
客户端的登入和退出当局域网中一个客户端运行后,该客户端首先会启动一个ReceiveMessage线程用于接收其他主机发送的消息,同时利用UDP协议向局域网发送一个局域网广播M_LOGIN类型的登入消息,广播中已经登入的N个客户端(包括刚刚登入的这个客户端)将对这个登入消息进行响应,将这个刚刚上线的主机的IP地址添加到自己的用户列表中,同时向这个客户端发送一个M_RELOGIN类型的消息,而这个刚上线的客户端将把收到的所有M_RELOGIN类型消息的主机IP地址添加到自己的用户列表中,从而实现局域网中所有主机均可及时探测并更新在线用户列表,如下图所示:
文本消息的传输逻辑较为简单,客户端首先选择广播地址广播发送或某个用户的IP地址私聊Message类型消息,同时更新自己的消息记录,消息的接收者收到消息后判断是否是自己发送的广播消息,若不是自己发送的消息则更新消息记录,否则不做任何操作。
文件传输逻辑在客户端进行文件传输时,文件发送方将于文件接收方建立TCP连接,并分别创建FileSender和RecvFile线程分别用于发送和接收文件数据,其具体流程如下图所示:
客户端首先选择需要进行语音通话的对象,然后向该对象发送M_VOICE语音通话请求,当接收者同意语音通话时将返回一个M_AC_VOICE消息用于确认语音通话,双方分别启动VoiceSender和VoiceReceiver线程进行语音消息的发送和接收,当某一方需要终止语音通话时,则向对方发送M_ST_VOICE消息终止通话,并销毁语言通讯相关线程,若接收者不同意语言通话将向语言通话发起者发送M_RE_VOICE消息,具体实现逻辑如下:
与语音通话类似,当某个客户端想要发起视频通话时,客户端首先选择需要进行视频通话的对象,然后向该对象发送M_VIDEO视频通话请求,当接收者同意视频通话时将返回一个M_AC_VIDEO消息用于确认视频通话,双方分别启动VideoSender和VideoReceiver线程进行视频消息的发送和接收,当某一方需要终止视频通话时,则向对方发送M_ST_VIDEO消息终止通话,并销毁相关线程,若接收者不同意语言通话将向语言通话发起者发送M_RE_VIDEO消息,具体实现逻辑如下:
远程控制主要通过ControlClient和ControlServer以及ControlCarrier线程实现,逻辑与语音和视频通话逻辑类似,当某个客户端想要进行远程控制操作时,首先向某个用户发起远程控制请求M_CONTROL,当被控制端接收请求时将回送一个M_AC_CONTROL类型消息,否则回送一个M_RE_CONTROL类型消息,当控制端想中断远程控制时将向被控制端发送一个M_ST_CONTROL1类型消息,当被控制想要中断远程控制时将向控制端发送M_ST_CONTROL2类型消息,具体逻辑流程如下:
这一部分建议对照代码来看,不然可能看的云里雾里
原报告中这部分的说明较多,这里已进行简化,看懂需要了解项目文件架构,看不懂也没有关系,可以直接看源代码
说明:项目文件夹中webcam-capture-0.3.10-dist目录为webcam第三方库,用于摄像头设备的调用,相关jar包在libs中也可以找到,若打开项目时题实webcam类找不到,需要重新导入libs目录下的三个jar包。
客户端登入时创建ReceiveMessage类线程接收消息,同时创建匿名线程监听文件传输端口的连接:
客户端手动添加主机,通过向该IP地址发送M_LOGIN类型消息实现:
当客户端需要发送消息时,首先需要判断用户是否选择了用户列表中的某个IP,若没有选择,则默认发送UDP广播消息,对局域网中存在的所有用户发送消息,关键代码请参考ReceiveMessage.java文件
关键代码如下:
当客户端收到一个M_SHAKE类消息时将调用ClientUI中的shake函数,该函数通过setLocation方法在一个范围内重新设置窗口的位置,最终实现了窗口抖动的效果:
在实现语音通话功能中用到了VoiceSender和VoiceReceiver线程,VoiceSender线程利用AudioSystem对象初始化客户端的麦克风设备,并通过TargetDataLine对象获取麦克风的数据,最后利用DatagramSocket和DatagramPacket对象将音频数据发送到接收端,接收端同样通过SourceDataLine对象将接收到的音频数据写入数据行缓冲区并播放,关键代码请参考VoiceSender.java文件
VoiceSender线程关键代码:
在实现视频通话时,我们使用了第三方jar包如下:
VideoSender线程通过Webcam对象调用摄像头并持续捕获图像数据,通过TCP方式与视频通话另一端建立连接,并将图片发送到另一个客户端的VideoReceiver线程,该线程收到图片信息后会将该图片写入视频通话窗口的JLabel控件中,通过每0.1秒更新这个控件,就可以制造出连续的视频,经过测试,该方式传输的数据较为稳定,视频能够比较流畅的显示在另一个客户端中。
关键代码请参考VideoSender.java文件 【估计大家也不想看了,不想贴图了】
远程控制的实现主要利用了ControlServer和ControlClient线程作为控制线程和被控制线程,同时封装了ControlCarrier类作为传输命令的类,ControlClient线程接收ControlServer线程发送的桌面截屏图片数据并绘制在控制窗口,同时ControlClient线程监控客户端的所有鼠标和键盘事件,并通过ControlCarrier对象进行封装,ControlServer对象接收到相应的控制命令后在被控制端利用Robot对象重现这些操作
关键代码请参考ControlClient.java和ControlServer.java文件 【估计大家也不想看了,不想贴图了】
如果能看到这里应该也是铁粉了~
若还有疑问,欢迎评论区留言



