写个示例程序
时间: 2023-10-10 20:11:36 浏览: 30
好的,下面是一个简单的基于 Qt 的多人聊天室示例程序:
server.h:
```cpp
#ifndef SERVER_H
#define SERVER_H
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
class Server : public QTcpServer
{
Q_OBJECT
public:
explicit Server(QObject *parent = nullptr);
protected:
void incomingConnection(qintptr socketDescriptor) override;
private slots:
void onReadyRead();
void onDisconnected();
private:
QList<QTcpSocket*> m_clients;
};
#endif // SERVER_H
```
server.cpp:
```cpp
#include "server.h"
Server::Server(QObject *parent) : QTcpServer(parent)
{
listen(QHostAddress::Any, 1234);
}
void Server::incomingConnection(qintptr socketDescriptor)
{
QTcpSocket *socket = new QTcpSocket(this);
socket->setSocketDescriptor(socketDescriptor);
m_clients.append(socket);
connect(socket, &QTcpSocket::readyRead, this, &Server::onReadyRead);
connect(socket, &QTcpSocket::disconnected, this, &Server::onDisconnected);
}
void Server::onReadyRead()
{
QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
if (!socket) {
return;
}
QByteArray data = socket->readAll();
foreach (QTcpSocket *client, m_clients) {
if (client != socket) {
client->write(data);
}
}
}
void Server::onDisconnected()
{
QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
if (!socket) {
return;
}
m_clients.removeOne(socket);
socket->deleteLater();
}
```
client.h:
```cpp
#ifndef CLIENT_H
#define CLIENT_H
#include <QTcpSocket>
class Client : public QObject
{
Q_OBJECT
public:
explicit Client(QObject *parent = nullptr);
void connectToServer(const QString &host, quint16 port);
void send(const QByteArray &data);
signals:
void received(const QByteArray &data);
private slots:
void onReadyRead();
void onConnected();
void onError(QAbstractSocket::SocketError error);
private:
QTcpSocket m_socket;
};
#endif // CLIENT_H
```
client.cpp:
```cpp
#include "client.h"
Client::Client(QObject *parent) : QObject(parent)
{
connect(&m_socket, &QTcpSocket::readyRead, this, &Client::onReadyRead);
connect(&m_socket, &QTcpSocket::connected, this, &Client::onConnected);
connect(&m_socket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), this, &Client::onError);
}
void Client::connectToServer(const QString &host, quint16 port)
{
m_socket.connectToHost(host, port);
}
void Client::send(const QByteArray &data)
{
m_socket.write(data);
}
void Client::onReadyRead()
{
QByteArray data = m_socket.readAll();
emit received(data);
}
void Client::onConnected()
{
qDebug() << "Connected to server";
}
void Client::onError(QAbstractSocket::SocketError error)
{
qDebug() << "Socket error:" << error << m_socket.errorString();
}
```
main.cpp:
```cpp
#include <QCoreApplication>
#include <QDebug>
#include "server.h"
#include "client.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// Start server
Server server;
qDebug() << "Server listening on port" << server.serverPort();
// Connect clients to server
Client client1, client2;
client1.connectToServer("localhost", server.serverPort());
client2.connectToServer("localhost", server.serverPort());
// Send messages between clients
QObject::connect(&client1, &Client::received, &client2, &Client::send);
QObject::connect(&client2, &Client::received, &client1, &Client::send);
return a.exec();
}
```
这个示例程序基于 TCP 协议实现了一个简单的多人聊天室,可以通过连接到服务器的方式实现多个客户端之间的聊天和消息传递。如果要实现语音通话,需要使用 Qt 的 QtMultimedia 模块来捕获和播放音频数据,并通过类似于发送消息的方式将音频数据发送到服务器和其他客户端。