Qt中Tcp:Server、Client

来源:互联网 发布:网上考试源码 编辑:程序博客网 时间:2024/05/01 15:22
//============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(){}
0 0
原创粉丝点击