赞
踩
本次项目采用的是TCP传输文件,UDP实现聊天以及聊天状态的反馈。
一、首先运行程序会进入到这样一个会话界面,也就是新加入一个用户,新加入的用户会在右侧显示其用户名、主机名和IP地址,在消息记录框中也会提示在线信息。
二、消息字体样式、字体大小、加粗、斜体、下划线、颜色的效果展示。
三、进行文件传输。
1. 进行文件传输前要先从右侧列表选择传输的对象,然后选择传输的文件。
2. 文件选择后会显示将要发送的文件名,即可点击发送。
3. 发送端点击发送后,接收端会弹出是否接收文件的提示框,然后进行选择。选择接收后会再次弹出保存文件的对话框,选择保存路径,就完成了文件的传输。
四、保存聊天记录会弹出保存文件对话框选择保存路径,输入保存文件名即可,这里保存聊天记录和清空聊天消息框内容就不做展示了,直接上代码。
- #ifndef WIDGET_H
- #define WIDGET_H
-
- #include <QWidget>
- #include <QTextCharFormat>
- class QUdpSocket;
- class TcpServer;
-
- namespace Ui {
- class Widget;
- }
-
- enum MessageType{Message, NewParticipant, ParticipantLeft, FileName, Refuse};
-
- class Widget : public QWidget
- {
- Q_OBJECT
-
- public:
- explicit Widget(QWidget *parent = 0);
- ~Widget();
-
- protected:
- void newParticipant(QString userName,QString localHostName, QString ipAddress); //添加新用户加入
- void participantLeft(QString userName,QString localHostName, QString time); //用户离开
- void sendMessage(MessageType type, QString serverAddress=""); //发送UDP数据
- QString getIP(); //获取IP
- QString getUserName(); //获取用户名
- QString getMessage(); //获取用户聊天信息
- void hasPendingFile(QString userName, QString serverAddress,QString clientAddress, QString fileName);//判断接收文件
-
- bool saveFile(const QString& fileName); //保存文件
- void closeEvent(QCloseEvent *); //关闭事件
-
- private:
- Ui::Widget *ui;
- QUdpSocket *udpSocket;
- qint16 port;
- QString fileName;
- TcpServer *server;
- QColor color;
-
- public slots:
- void processPendingDatagrams(); //接收UDP数据
- void on_sendButton_clicked(); //发送
- void getFileName(QString); //获取文件名
- void on_sendToolBtn_clicked(); //传输文件发送
- void on_fontComboBox_currentFontChanged(QFont f); //更改字体
- void on_sizeComboBox_currentIndexChanged(QString ); //更改字体大小
- void on_boldToolBtn_clicked(bool checked); //加粗
- void on_italicToolBtn_clicked(bool checked); //倾斜
- void on_underlineToolBtn_clicked(bool checked); //下划线
- void on_colorToolBtn_clicked(); //颜色设置
-
- void currentFormatChanged(const QTextCharFormat &format);
- void on_saveToolBtn_clicked(); //保存聊天记录
- void on_clearToolBtn_clicked(); //清空记录
- void on_exitButton_clicked(); //退出
- };
-
- #endif // WIDGET_H
- #include "widget.h"
- #include "ui_widget.h"
- #include <QUdpSocket>
- #include <QHostInfo>
- #include <QMessageBox>
- #include <QScrollBar>
- #include <QDateTime>
- #include <QNetworkInterface>
- #include <QProcess>
- #include "tcpserver.h"
- #include "tcpclient.h"
- #include <QFileDialog>
- #include <QColorDialog>
-
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- setWindowIcon(QPixmap(":/C:/Users/liuqy/Desktop/qq.png"));
- //创建UDP套接字,并初始化
- udpSocket = new QUdpSocket(this);
- port = 45454;
- udpSocket->bind(port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
- connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
- sendMessage(NewParticipant);
-
- //创建TCP套接字
- server = new TcpServer(this);
- connect(server, SIGNAL(sendFileName(QString)), this, SLOT(getFileName(QString)));
-
- connect(ui->messageTextEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)),
- this, SLOT(currentFormatChanged(const QTextCharFormat)));
- }
- Widget::~Widget()
- {
- delete ui;
- }
- //发送UDP数据
- void Widget::sendMessage(MessageType type, QString serverAddress)
- {
- QByteArray data;
- QDataStream out(&data, QIODevice::WriteOnly);
- QString localHostName = QHostInfo::localHostName();
- QString address = getIP();
- out << type << getUserName() << localHostName;
-
- switch(type)
- {
- case Message :
- if (ui->messageTextEdit->toPlainText() == "") {
- QMessageBox::warning(0,tr("警告"),tr("发送内容不能为空"),QMessageBox::Ok);
- return;
- }
- out << address << getMessage();
- ui->messageBrowser->verticalScrollBar()
- ->setValue(ui->messageBrowser->verticalScrollBar()->maximum());
- break;
-
- case NewParticipant :
- out << address;
- break;
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。