QT实现TCP通信

相关代码有已经放入我的资源,有兴趣可前往下载

对于qt下的tcp,如下图:

一.服务器端

1.建立套接字

    server=new QTcpServer(this);  //监听套接字
    server->listen(QHostAddress::Any,8888);//QHostAddress对应网卡ip地址
    setWindowTitle("服务器:8888");

2.客户端发过来连接请求槽函数处理,和客户端发过来信息的处理,分别两个槽函数

//第一个槽函数--只要有客户端连接服务器,服务器就会产生newConection的信号,然后对这个信号处理
//获取这个客户端的套接字,然后获取其ip和端口,   
//第二个槽函数:只要客户端发过来消息就会触发readyRead信号,然后读取信息内容并显示 
connect(server,&QTcpServer::newConnection,
          [=]()
    {
        //取出建立好连接的套接字
        st1=server->nextPendingConnection();
        //显示谁和我连接:获取ip和端口
        QString ip=st1->peerAddress().toString();
        qint16 port=st1->peerPort();
        //组一个包显示
        QString temp=QString("[%1:%2]:成功连接").arg(ip).arg(port);
        //将对方连接信息显示在编辑框中
         ui->readedit->setText(temp);
         connect(st1,&QTcpSocket::readyRead,
               [=]()
         {
               //从通信套接字中取出内容
               QByteArray arr=st1->readAll();                     //返回值QByteArray
               //显示在编辑框中
               ui->readedit->append(arr);
         }
                 );
    }
            );

3.发送信息

void Widget::on_sendbutton_clicked() //用了一个button来发消息
{
    if(st1=NULL)
    {
        qDebug()<<"socket为NULL!";
        return ;
    }
    qDebug()<<"socket不为NULL!";
    //获取编辑区内容
     QString str2=ui->writeedit->toPlainText();
     qDebug()<<str2.toUtf8().data();
     st1->write(str2.toUtf8().data());    //发消息
     qint64 p1=st1->write("111");
     qDebug()<<p1;
}

二.客户端

1.怎么知道连接成功和获取消息

//也是两个槽函数
//第一个用来发送连接请求
//第二个用来获取消息(连接成功socket套接字都会被对方的connected触发)
ClientWidget::ClientWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClientWidget)
{
    ui->setupUi(this);
     setWindowTitle("客户端");
    st2=NULL;
    //分配空间
    st2=new QTcpSocket(this);
    connect(st2,&QTcpSocket::connected,
           [=]()
    {
        ui->readedit->setText("连接成功!");
    }
            );
    connect(st2,&QTcpSocket::readyRead,
           [=]()
    {
        //获取对方发送的消息
        QByteArray arr2=st2->readAll();
        //放入编辑框
        ui->readedit->append(arr2);
    }
            );
}

2.连接

void ClientWidget::on_connectbutton_clicked()
{
    //从lineedit中获取服务器端口和ip
    QString ip=ui->ipedit->text();
    qint16 port=ui->portedit->text().toInt();
    //主动和服务器建立连接
    st2->connectToHost(QHostAddress(ip),port);

}

3.发送消息(差不多的代码)

void ClientWidget::on_sendbutton_clicked()
{
    //获取编辑框内容
    QString str=ui->writeedit->toPlainText();
    //发送消息
    st2->write(str.toUtf8().data());
}

最后,这只是单个服务器单个客户端,然而对于一个服务器多个客户端的情况下,也是可以的。不能多个客户端在于:

 st1=server->nextPendingConnection();//只接受了一个通信套接字,每当有新连接就会断开上一个

处理的方法可以把所有的连接放在list里边,然后再处理。

详情见:https://www.techieliang.com/2017/12/530/

猜你喜欢

转载自blog.csdn.net/luoshiyong123/article/details/84796929