QTcpServer如何监听两个不同的端口

今天写了一个小程序,本打算测试如何实现QTcpServer监听两个端口,忙活了将近一天,特来记录一下。

本来以为很简单,创建一个MyThread线程继承自QThread,把QTcpServer tcpserver放在该新建线程中,然后在run方法中进行监听,关联信号和槽函数,下面贴一下原来的代码

创建MyThread线程

class MyThread:public QThread

{

 public:

      run();

      QTcpServer *tcpServer;

private slots:

     sendMessage()

}

void MyThread::run()

{

   tcpServer = new QTcpServer();

 

   if(!tcpServer->listen(QHostAddress("192.168.1.110"),6666))

        {  //监听本地主机的6666端口,如果出错就输出错误信息,并关闭
            qDebug() << tcpServer->errorString();
            close();
        }
      connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()));

}

void MyThread:: sendMessage()

{

       QTcpSocket *clientConnection = tcpServer->nextPendingConnection();

    clientConnection->write("woshixiancheng");

}

客户端的代码就不贴出来了,知识读取字符串的函数readall();

上面的程序是一种错误的做法,具体哪个地方不正确,我还没有找出答案,我觉得这种方法理论上应该是正确的,也有可能是我的问题,希望有高手可以告诉一下,再次感谢


下面说一说正确的做法,今天在网上搜索了一天,只能有种work-object的方法,具体也不太明白,首先创建一个类继承自QObject

class MyObject:public QObject

{
    Q_OBJECT
    QTcpServer *tcpServer1;
    private slots:
         void sendMessage();
         void first();
};
然后在主函数中填写如下代码
 myobj = new MyObject();创建一个对象
 thread = new QThread();创建一个线程
 myobj->moveToThread(thread1);move到线程thread中,这样就可以线程中操作
 thread->start();
 connect(thread,SIGNAL(started()),myobj,SLOT(first()));关联到槽函数
first代码如下
void MyObject::first()
{
    tcpServer = new QTcpServer();
    if(!tcpServer->listen(QHostAddress("192.168.1.110"),6666))
        {  //监听本地主机的6666端口,如果出错就输出错误信息,并关闭
            qDebug() << tcpServer1->errorString();
        }
     connect(tcpServer1,SIGNAL(newConnection()),this,SLOT(sendMessage()));
}
sendMessage代码如下
void MyObject::sendMessage()
{
    QTcpSocket *clientConnection = tcpServer1->nextPendingConnection();
    clientConnection->write("woshixiancheng1");
     qDebug() << QThread::currentThreadId();打印当前线程id
}
这里就完成了,另一个监听端口我放在主线程中,把如下代码放在主线程中就可以了
定义一个tcpServer1和sendMessage1槽函数
  if(!tcpServer1->listen(QHostAddress("192.168.1.110"),7777))
        {  //监听本地主机的6666端口,如果出错就输出错误信息,并关闭
            qDebug() << tcpServer->errorString();
            close();
        }
      connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage1()));
void MyObject::sendMessage1()
{
    QTcpSocket *clientConnection = tcpServer1->nextPendingConnection();
    clientConnection->write("woshixiancheng2");
     qDebug() << QThread::currentThreadId();打印当前线程id
}
看一下效果




  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
如果你希望两个客户端之间进行单人聊天,可以通过让它们使用相同的端口来实现。在传统的客户端-服务器模型中,通常一个服务器监听一个特定的端口,而客户端会连接到该端口服务器进行通信。 在这种情况下,你可以将其中一个客户端充当服务器角色,监听指定的端口。另一个客户端则作为客户端角色,连接到该端口服务器进行通信。这样,两个客户端就可以通过相同的端口号进行单人聊天。 下面是一个简单的示例代码,演示了一个客户端充当服务器角色,另一个客户端作为客户端角色进行通信的实现: 服务器客户端(作为服务器角色): ```cpp QTcpServer* server = new QTcpServer(this); server->listen(QHostAddress::Any, 1234); // 监听端口1234 // 当有新的连接时 void YourServerClass::onNewConnection() { QTcpSocket* socket = server->nextPendingConnection(); connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead())); } // 当接收到消息时 void YourServerClass::onReadyRead() { QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender()); QByteArray data = socket->readAll(); // 处理接收到的消息 } ``` 客户端(作为客户端角色): ```cpp QTcpSocket* socket = new QTcpSocket(this); socket->connectToHost("server_ip", 1234); // 连接到服务器的IP和端口 // 当接收到消息时 void YourClientClass::onReadyRead() { QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender()); QByteArray data = socket->readAll(); // 处理接收到的消息 } // 发送消息 void YourClientClass::sendMessage() { QString message = "Your message"; socket->write(message.toUtf8()); } ``` 在上述代码中,服务器客户端通过调用listen()方法监听指定的端口,然后使用nextPendingConnection()方法接受新的连接。当接收到新的连接时,会为每个连接创建一个QTcpSocket对象,并连接到readyRead()信号,以便在接收到消息时进行处理。 客户端通过connectToHost()方法连接到指定的服务器IP和端口。然后同样连接到readyRead()信号,以便在接收到消息时进行处理。在发送消息时,可以使用socket对象的write()方法将消息发送给服务器。 需要注意的是,在上述代码中,你需要将"server_ip"替换为实际的服务器IP地址,并根据需要调整端口号。 希望这个示例能帮助你实现两个客户端之间的单人聊天。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值