Qt-tcp连接
服务端:
1.创建用于监听套接字
2.设置套接字为监听
3.当有新的客户端要连接时,该套接字会发出newConnection()的信号,
4.接着要建立连接时调用nextPendingConnect()返回一个QTcpSocket对象用于通信
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include
#include
#include
#include
#include
namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;QTcpServer *my_sever;QList my_client;int len;
private slots:void newConnectionSlots();//新用户连接void disConnectSlots();//客户端断开void readyReadSlots();//客户端读取消息void on_pushButton_listen_clicked();void on_pushButton_send_clicked();
};#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
#include
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("服务端");len=0;ui->lcdNumber_sockeNum->display(len);my_sever=new QTcpServer();connect(my_sever,&QTcpServer::newConnection,this,&Widget::newConnectionSlots);}Widget::~Widget()
{delete ui;
}void Widget::newConnectionSlots()
{QTcpSocket *sock=my_sever->nextPendingConnection();my_client.append(sock);len++;ui->lcdNumber_sockeNum->display(len);QString info;info+="ip="+sock->peerAddress().toString()+" 端口="+QString::number(sock->peerPort());ui->textBrowser_clientInfo->append(info);connect(sock,&QTcpSocket::readyRead,this,&Widget::readyReadSlots);
}void Widget::disConnectSlots()
{}void Widget::readyReadSlots()
{QTcpSocket *sock=qobject_cast(sender());if(sock!=NULL){if(sock->isReadable()){int len=sock->bytesAvailable();QByteArray arr=sock->read(len>65536?65536:len);QString str=QString::fromLocal8Bit(arr);qDebug()<textBrowser_recv->append(str);}}}void Widget::on_pushButton_listen_clicked()
{QString ip=ui->lineEdit_address->text();qint16 port=ui->lineEdit_port->text().toInt();QHostAddress address=QHostAddress(ip);qDebug()<isListening()){if(!my_sever->listen(address,port)){qDebug()<errorString();return ;}else{ui->pushButton_listen->setText("停止监听");}}else{my_sever->close();ui->pushButton_listen->setText("开始监听");}
}void Widget::on_pushButton_send_clicked()
{QString str=ui->plainTextEdit_sendInfo->toPlainText();if(str==""){QMessageBox::warning(this,"警告","发送内容不能为空");return ;}QString res;res+="服务端: "+str;QByteArray arr=res.toUtf8();ui->plainTextEdit_sendInfo->clear();ui->plainTextEdit_sendInfo->setFocus();for(int i=0;iwrite(arr);}ui->textBrowser_recv->append(res);}
客户端:
1.创建套接字
2.连接服务器 connectToHost();
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include
#include
#include
namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();
private slots:void readyReadSlots();void on_pushButton_send_clicked();void on_pushButton_listen_clicked();private:Ui::Widget *ui;QTcpSocket *my_socket;bool connectstat;};#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("客户端");my_socket=new QTcpSocket();connectstat=false;connect(my_socket,&QTcpSocket::readyRead,this,&Widget::readyReadSlots);
}Widget::~Widget()
{delete ui;
}void Widget::readyReadSlots()
{int len=my_socket->bytesAvailable();QByteArray arr=my_socket->read(len>65536?65536:len);QString str=QString::fromUtf8(arr);ui->textBrowser_recv->append(str);}void Widget::on_pushButton_send_clicked()
{QString str=ui->plainTextEdit_sendInfo->toPlainText();if(str==""){QMessageBox::warning(this,"警告","发送的内容不能为空");return ;}ui->plainTextEdit_sendInfo->clear();ui->plainTextEdit_sendInfo->setFocus();QString res;res+="ip="+my_socket->peerAddress().toString()+" 端口="+QString::number(my_socket->peerPort())+": "+str;QByteArray arr=res.toLocal8Bit();my_socket->write(arr);ui->textBrowser_recv->append(res);
}void Widget::on_pushButton_listen_clicked()
{QString ip=ui->lineEdit_address->text();qint16 port=ui->lineEdit_port->text().toInt();QHostAddress address=QHostAddress(ip);if(!connectstat)//如果没有连接{my_socket->connectToHost(address,port);if(!my_socket->waitForConnected(5000)){qDebug()<errorString();return ;}else{ui->pushButton_listen->setText("断开连接");connectstat=true;}}else{ui->pushButton_listen->setText("开始监听");connectstat=false;}
}
成果:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
