QT实现tcp通信

客户端与服务器建立连接

客户端给服务器发送数据

一、tcp服务器的ui界面设计

接受框:Group Box+Plain Text Edit 设置为readonly

端口号:Line Edit

发送窗口:Line Edit

其余按钮:Push Button

二、tcp服务器逻辑业务实现

服务器端需要用到QTcpServer、QTcpSocket对象需要现在头文件中引用,还需要在pro文件的QT中加入network(如果不加入network引入头文件会失败的)

在头文件中定义对象

并在使用文件中new分配内存

2.1监听、新建关联、准备接收

tcp服务器需要监听所有地址的数据(把该功能放进打开服务器按键的槽函数中)

   tcpServer ->listen(QHostAddress::Any,ui->portEdit->text().toUInt());

Any表示监听本机的所有网口的,第二个参数表示监听的网络端口。

这段代码表示我要监听所有的网口,端口在我们选择的那个框上的文本转为usignedint类型

如果监听到并建立连接的时候客户端会触发服务器发送一个newConnection信号,因此我们这边需要新建一个connect函数,当收到newConnection信号的时候进入槽函数

    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
void Widget::newConnection_Slot()
{
    //使用该函数可以取出已连接的套接字
    tcpSocket = tcpServer ->nextPendingConnection();
    //当收到readyRead信号表示要读了
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_solt()));
}

当socket发送readyread时候表示客户端发来了文字,我们需要接收并显示

    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_solt()));
void Widget::readyRead_solt()
{
    QString buff;
    buff = tcpSocket ->readAll();
    ui ->receiveEdit ->appendPlainText(buff);
}

2.2关闭按键

void Widget::on_closeBt_clicked()
{
    //关闭
    tcpServer ->close();
}

2.3发送按键

void Widget::on_sendBt_clicked()
{
    tcpSocket ->write(ui->sendEdit->text().toLocal8Bit().data());
}

注意SLOT和SIGNAL中的函数需要加括号SLOT(A())这样才对

最后实现结果如下:

三、tcp客户端的ui界面设计

设计界面如下,由于客户端连接时候需要输入服务器ip地址,因此多了一个ip框

四、tcp客户端逻辑功能实现

客户端需要使用QTcpSocket,因此我们需要在pro文件先加入network库再去.h文件加入QTcpSocket文件。

4.1打开客户端

打开客户端时候我们需要主动向服务器发送链接按钮,需要输入ip以及端口,注意端口需要转化为unsigned int类型

void Widget::on_openBt_clicked()
{
    //连接主机
    //    virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
    tcpsocket->connectToHost(ui->ipEdit->text(),ui->portEdit->text().toUInt());
    connect(tcpsocket,SIGNAL(connected()),this,SLOT(connected_slot()));
}

当完成连接的时候tcpsocket会发送connected信号,进入其槽函数

void Widget::connected_slot()
{
    connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot()));
}

槽函数再等待到数据的时候得到得到readyRead信号,这时候需要显示信息

void Widget::readyRead_slot()
{
    ui->receiveEdit->appendPlainText(tcpsocket->readAll());
}

4.2关闭按钮以及发送按钮实现

最后将127.0.0.1当作服务器ip即可

void Widget::on_closeBt_clicked()
{
    tcpsocket->close();
}

void Widget::on_sendBt_clicked()
{
    tcpsocket->write(ui->sendEdit->text().toLocal8Bit().data());
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值