//============server==============
#include "TcpServer.h"
#include <QHBoxLayout>
#include <QNetworkInterface>
#include <QMessageBox>
#include "ChooseInterface.h"
TcpServer::TcpServer(QWidget *parent) :
    QWidget(parent)
{
    // 创建服务器并监听
    _server = new QTcpServer;

    _server->listen(QHostAddress::Any, 9988);

    //当有客户端来连接时,调用slotNetConnection方法
    connect(_server, SIGNAL(newConnection()),
            this, SLOT(slotNetConnection()));

    _show = new QTextBrowser;
    QHBoxLayout* lay = new QHBoxLayout(this);
    lay->addWidget(_show);
}

void TcpServer::slotNetConnection()
{
    // 判断是否有未处理的连接,相当于C语言中的accept()
    while(_server->hasPendingConnections())
    {
        // 调用nextPeddingConnection去获得连接的socket
        _socket = _server->nextPendingConnection();

        _show->append("New connection ....");

        // 为新的socket提供槽函数,来接收数据
        connect(_socket, SIGNAL(readyRead()),
                this, SLOT(slotReadyRead()));
    }
}

void TcpServer::slotReadyRead()
{
    // 接收数据,判断是否有数据,如果有,通过readAll函数获取所有数据
    while(_socket->bytesAvailable() > 0)
    {
        _show->append("Data arrived ..... ");
        QByteArray buf = _socket->readAll();
        _show->append(buf);
    }
}

//==============client==============
#include "TcpClient.h"
#include <QHBoxLayout>
#include <QPushButton>
TcpClient::TcpClient(QWidget *parent) :
    QWidget(parent)
{
    _socket = new QTcpSocket(this);
    _socket->connectToHost("127.0.0.1", 9988);

    _lineEdit = new QLineEdit;
    QHBoxLayout* lay = new QHBoxLayout(this);
    lay->addWidget(_lineEdit);
    QPushButton* button = new QPushButton("Send");

    lay->addWidget(button);
    connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClick()));

    connect(_lineEdit, SIGNAL(returnPressed()), this, SLOT(slotButtonClick()));
}

void TcpClient::slotButtonClick()
{
    QString strText = _lineEdit->text();
    if(strText.isEmpty())
        return;

    _socket->write(strText.toUtf8());
    _lineEdit->clear();
}


//client-example
#include "widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QHostAddress>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    tcpsocket=new QTcpSocket(this);
    btn1=new QPushButton(tr("连接"));
    btn2=new QPushButton(tr("发送"));
    connect(btn1,SIGNAL(clicked()),this,SLOT(btn1_click()));
    connect(btn2,SIGNAL(clicked()),this,SLOT(btn2_click()));
    edit1=new QLineEdit();
    edit2=new QLineEdit();
    edit3=new QLineEdit();
    label1=new QLabel(tr("IP地址:"));
    label2=new QLabel(tr("端口号:"));
    label3=new QLabel(tr("消息内容:"));
    textb=new QTextBrowser();
    QHBoxLayout *lay1=new QHBoxLayout();
    lay1->addWidget(label1);
    lay1->addWidget(edit1);
    lay1->addWidget(label2);
    lay1->addWidget(edit2);
    lay1->addWidget(btn1);
    QHBoxLayout *lay2=new QHBoxLayout();
    lay2->addWidget(label3);
    lay2->addWidget(edit3);
    lay2->addWidget(btn2);
    QHBoxLayout *lay4=new QHBoxLayout();
    lay4->addWidget(textb);
    QVBoxLayout * lay3=new QVBoxLayout(this);
    lay3->addLayout(lay1);
    lay3->addLayout(lay2);
    lay3->addLayout(lay4);
    /*接收数据*/
    connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(myrecvdata()));

}

bool stat = true;
//连接
void Widget::btn1_click()
{

    if(stat == true)
    {

        /*禁用按钮,值是false*/
        //btn1->setEnabled(false);
        //获取IP地址
        QString ipaddr=edit1->text();
        edit1->setEnabled(false);
        //获取端口号
        QString port=edit2->text();
        edit2->setEnabled(false);

        serverip=new QHostAddress();
        serverip->setAddress(ipaddr);

        tcpsocket->connectToHost(*serverip,port.toInt());
        connect(tcpsocket, &QTcpSocket::connected, [&](){
                QMessageBox::information(this,"Tips","conn success.");

            });
        btn1->setText(tr("断开"));
        stat = false;
    }
    else
    {

        //释放socket连接
        delete serverip;
        serverip = NULL;

        edit1->setEnabled(true);
        edit2->setEnabled(true);

        stat = true;
        btn1->setText(tr("连接"));

    }

}

//发送
void Widget::btn2_click()
{
    QString strtext=edit3->text();
    if(!strtext.isEmpty())
        tcpsocket->write(strtext.toStdString().data());

    /*清空输入框*/
    edit3->clear();
    /*设置输入框重新获得焦点*/
    edit3->setFocus();
}

//接收消息
void Widget::myrecvdata()
{
    char buf[1024]={0};
    /*bytesAvailable()表示有效数据*/
    while(tcpsocket->bytesAvailable()>0)
    {
        memset(buf,0,sizeof(buf));
        tcpsocket->read(buf,sizeof(buf));
        textb->append(buf);
        //QMessageBox::information(this,"消息",buf);
    }
}

//关闭
void Widget::closeEvent(QCloseEvent *event)
{
    if(QMessageBox::question(this,"提示","你确定要退出程序吗?",QMessageBox::Yes|QMessageBox::No,QMessageBox::No)==QMessageBox::Yes)
    {
        event->accept();
    }else
    {
        event->ignore();
    }
}

Widget::~Widget()
{

}

备份地址: 【Qt中Tcp:Server、Client