在Vmware里用Qt实现(2)网络的聊天程序(C,Qt) 编写一个局域网聊天程序;要求多个client能够聊天(接收、发送消息)。 系统分为服务器和客户端。 服务器主要是保存在线client的信息(name,ip,port); Client端是用户端,能够与其他client进行聊天; Client启动时将信息(name,ip,port)传输到服务器端。 Client要查看在线:list命令 Client要聊天:talkto 命令。相关操作及代码
时间: 2024-02-06 12:12:22 浏览: 108
以下是在Qt中实现局域网聊天程序的相关操作和代码:
1. 服务器端代码:
```
// 创建QTcpServer对象,监听客户端连接请求
QTcpServer *server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));
// 新的连接请求到来时,分配一个新的线程进行处理
void Server::newConnection()
{
QTcpSocket *socket = server->nextPendingConnection();
ClientThread *thread = new ClientThread(socket, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
// 新线程的处理过程
void ClientThread::run()
{
// 接收客户端的消息
QByteArray data = socket->readAll();
// 处理消息
QString cmd = data.split(' ')[0];
if (cmd == "list") {
// 获取在线列表
QByteArray listData;
for (int i = 0; i < server->clients.size(); i++) {
ClientInfo info = server->clients.at(i);
QString clientData = QString("%1 %2 %3\n").arg(info.name).arg(info.ip).arg(info.port);
listData.append(clientData.toUtf8());
}
// 发送在线列表给客户端
socket->write(listData);
} else if (cmd == "talkto") {
// 发送消息给指定客户端
QString name = data.split(' ')[1];
QString message = data.split(' ')[2];
for (int i = 0; i < server->clients.size(); i++) {
ClientInfo info = server->clients.at(i);
if (info.name == name) {
QTcpSocket *clientSocket = server->clientSockets.at(i);
clientSocket->write(message.toUtf8());
break;
}
}
}
}
// 保存在线client的信息
struct ClientInfo {
QString name;
QString ip;
int port;
};
QList<ClientInfo> clients;
QList<QTcpSocket *> clientSockets;
// 在客户端连接时保存客户端信息
void Server::newConnection()
{
QTcpSocket *clientSocket = server->nextPendingConnection();
QString name = "Unknown";
QString ip = clientSocket->peerAddress().toString();
int port = clientSocket->peerPort();
// 接收客户端的消息,获取客户端的用户名
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readData()));
void Server::readData()
{
QTcpSocket *clientSocket = qobject_cast<QTcpSocket *>(sender());
QByteArray data = clientSocket->readAll();
name = data;
// 将客户端信息保存到列表中
ClientInfo info;
info.name = name;
info.ip = ip;
info.port = port;
clients.append(info);
clientSockets.append(clientSocket);
// 发送在线列表给客户端
QByteArray listData;
for (int i = 0; i < clients.size(); i++) {
ClientInfo info = clients.at(i);
QString clientData = QString("%1 %2 %3\n").arg(info.name).arg(info.ip).arg(info.port);
listData.append(clientData.toUtf8());
}
clientSocket->write(listData);
}
}
```
2. 客户端代码:
```
// 连接服务器端
QTcpSocket *socket = new QTcpSocket(this);
socket->connectToHost("127.0.0.1", 1234);
// 发送客户端的信息(name,ip,port)给服务器端
QString data = QString("%1 %2 %3").arg(name).arg(ip).arg(port);
socket->write(data.toUtf8());
// 查看在线列表
socket->write("list");
// 聊天
QString message = QString("talkto %1 Hello, world!").arg(name);
socket->write(message.toUtf8());
// 接收服务器端的消息
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
void Client::readData()
{
QByteArray data = socket->readAll();
// 处理消息
// ...
}
```
上述代码只是基本实现思路的部分代码示例,具体实现还需要根据实际情况进行调整和完善。同时,在实现过程中还需要注意线程和共享内存的安全问题,以及消息的序列化和反序列化等问题。
阅读全文