QT开发多线程服务器,可实现多电脑上通信。

大二就用Java写了TCP协议的聊天软件,不过当时只能在自己的机子上能连接成功,最近把程序打包了才行,可能之前没打包,会有些环境不能够匹配,首先我们在编写服务器之前为们就需要了解TCP通信相关基础知识,有了基础才能更好的去开发。
首先我们来了解用QT开发需要用到哪些函数,为了便于大家阅读,我用图像的方式展示出来:
在这里插入图片描述
在myServer类里面主要是实现创建服务器,和启动监听,服务器时总是被动的连接,因而要调用Listen函数不断去监听新的客户端。

myServer = new Server(this);
myServer->listen(QHostAddress::Any,8002);

监听有2个参数,一个是QHostAdress::Any表示地址类型
第二个就算设置服务器的端口号,客户端要连接服务器需要知道服务器的ip与端口号,因为ip不用我们去设置,所以我们要去设置端口号,这样ip与端口号就组成了套接字。
当有新的连接到来时,myServer就会主动调用函数incomingConnection(qintptr socketDescriptor)
//qintptr socketDescriptor这个是每个客户端的套接字描述符,是唯一的,为了后面分别客户端的一个依据。
此时我们在这里创建线程。

socketDes = (int)socketDescriptor;
thread = new ServerThread(socketDes);
/*信号与槽用来传递各类之间消息*/
connect(thread,&ServerThread::socketDes,this,&Server::dealsocketDes)
connect(thread,&ServerThread::recDateSingal,this,&Server::recDateSlot);
connect(this,&Server::sendDateSignal,thread,&ServerThread::sendDateSlot);
thread->start();//启动线程

当我线程启动后,首先我们要设置套接字的描述符,这样套接字就对应的客户端了,然后可以读写数据了。
mySocket做为myThread的成员,所以我们在run()函数创建mySocket对象

mySocket = new Socket(socketDescriptor);
//设置套接字描述符
    if(mySocket->setSocketDescriptor(socketDescriptor))
    {
        qDebug()<<"客户端"<<socketDescriptor<<"连接成功";
        emit socketDes(socketDescriptor);
    }
//类之间传递信号    connect(mySocket,&Socket::recDate,this,&ServerThread::recDateSlot);
    connect(this,&ServerThread::sendDateSignal,mySocket,&Socket::sendDate);
    this->exec();//这个函数时保证run函数运行直到服务器关闭或者客户端断开连接

套接字连接好了,接下来只需要在mySocket里面实现读写函数就可以了

connect(this,&Socket::readyRead,
    [=]()
    {
        QString ip = peerAddress().toString().remove(0, 7);
        QByteArray data = readAll();
        emit recDate(ip,data);
    });

上面是通过readyRead信号进行监听客户端发送消息,当接到消息获取地址和内容再通过信号不断传会给界面类那里,这样就可以实现数据显示在界面上了。

void Socket::sendDate(int SocketDes,const QByteArray date)
{
    if(!date.isEmpty()&&socketDescriptor==SocketDes)
        this->write(date);
}

这是发送数据,同样,为了使得发送的数据能够传到对应的客户端,我们需要将mySocket的描述符比较,选择服务器真正相传的那个客户单。

总结:

我上面只提供一部分的代码,一是防止一些学生为了应对课程设计或者作业直接抄,二是为了锻炼大家的动手能力,我现在也是一个大四的学生,动手才能让我们更加熟练。
总结有些信号与槽主要是用于我们信息的传递,比如这个程序的是先写了一个界面,在界面调用myServer,然后myServer里面启动线程,线程里面创建mySocket,最后读写在mySocket类里实现,从而当我们发送消息首先要在界面类里面获取,然后一步一步传到相应的类。我自己现在也才慢慢的学习,上面只是我在学习过程不断了解的,然后记录下来,再用我的口吻告诉大家,目的为了能够让大家能够有所收获,再给我他妈的加点阅读量。最后一句话才是重点 干!

对了为了大家便于调试,请大家去下个网络调试助手。当做客户端连接你的客户机。这样你可以再多台电脑上用网络调试器连接你的服务器。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
基于Qt多线程的聊天室是一种使用Qt框架实现多线程网络通信应用程序。Qt是一个跨平台的C++应用程序开发框架,其多线程机制可用于实现并发网络通信。聊天室是一种允许多个用户在互联网上进行实时文本交流的在线平台。 基于Qt多线程的聊天室应用程序可以通过使用Qt多线程类和网络通信模块来实现。首先,需要创建一个服务器程序,该程序使用QtQtNetwork模块来监听用户的连接请求。当一个用户连接到服务器时,服务器会为其分配一个独立的线程来处理该用户的请求。这样,每个用户都可以在自己的线程中进行聊天,并与其他用户实时地进行消息传递。 在服务器端的实现中,需要使用QtQThread类来创建多个线程,并使用QTcpServer类来监听用户的连接请求。每个用户连接时,服务器会创建一个新的线程,并将该线程的socket连接用于与用户进行通信。 在客户端的实现中,需要使用QtQTcpSocket类来连接到服务器,并在一个独立的线程中进行读写操作。客户端可以通过使用Qt提供的信号和槽机制来与服务器进行消息的发送和接收。 总结来说,基于Qt多线程的聊天室是一种通过使用Qt框架的多线程和网络通信模块来实现的聊天应用程序。其优势是能够支持多个用户同时进行实时的文本交流,提高了并发处理能力,同时也提高了用户体验和程序的稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值