项目要求:
0 、接受局域网上其他电脑的数据;
1、发送数据给局域网上其他电脑;
2、可以随意设置发送ip地址;
3、程序界面及相关功能按钮
4、发送文件
5、保存及显示聊天记录
开发环境:
CentOS6、QT
接到这个任务后,一开始准备是用 tcp 搭建服务器,然后再写客户端完成这个任务。确实也做了一个星期,大概五天吧,客户端与服务器的框架也基本搭建完了,能够实现简单的数据传输。但是突然间就不想继续做下去了,突然想试试用 udp 做做看看是什么效果,还好,没让我自己失望,很适合用 udp 做这个局域网内的即时通信软件。
(获取用户列表,随时更新用户列表)
使用 udp 的思路是:每当有一个客户端上线的时候,它就向局域网内广播,告知同网段内所有上线用户,然后上线用户接收到这个上线的消息后,就去自己的用户列表查看是否有这个用户,如果没有就将这个用户加到自己的用户列表,同时,它还向这个上线用户发出一个“我知道了”的消息,这时,新上线的用户收到消息后,就将这个用户加入到自己的用户列表。
当用户下线时,它就向局域网内广播,告知所有用户“我下线了”,当其他用户接收到这个广播后,就将这个用户从用户列表内删除。因此,只能与在线用户相互传递消息。
当需要与某以用户聊天时,只需点击显示该用户的按钮。聊天时是用 udp 直接向用户写数据。还可以直接传送文件,修改字体,颜色,查看消息记录。
本软件未实现功能,昵称的修改,默认的所有用户的昵称均为 User ,相互之间发送表情。
我将通信一块抽象包装在一个类中。
#include "communicate.h"
#include<QtNetwork>
Communicate::Communicate(QObject *parent) :
QObject(parent)
{
receiver = new QUdpSocket(this);
send=new QUdpSocket(this);
receiver->bind(2014,QUdpSocket::ShareAddress); //绑定端口2014,接收信息
connect(receiver,SIGNAL(readyRead()),this,SLOT(receiveMessage()));//udp 包装好的信号 readyRead(),当有数据传过来的时
//候,就会自动产生这个信号,然后可以自定义相关的槽对接受到的数据进行处理
}
// m 是自定义个结构体,并且重载了 << 和 >> 运算符。
//发送广播消息的函数
void Communicate::sendMulti(Message &m)
{
qDebug()<<"sendMulti";
QDataStream out(&datagram,QIODevice::WriteOnly);