-
QT學(xué)習(xí)TCP/IP通信(一個(gè)服務(wù)端對(duì)多個(gè)客戶端)
-
一、服務(wù)端:
1.創(chuàng)建QTcpServer對(duì)象
2.啟動(dòng)服務(wù)器(監(jiān)聽)調(diào)用成員方法listen(QHostAddress::Any,端口號(hào))
3.定義一個(gè)QLis容器對(duì)象存儲(chǔ)客戶信息;
4.當(dāng)有客戶端鏈接時(shí)候會(huì)發(fā)送newConnection信號(hào),觸發(fā)槽函數(shù)接受鏈接(得到一個(gè)與客戶端通信的套接字QTcpSocket及其ip、端口信息)
5.QTcpsocket發(fā)送數(shù)據(jù)用成員方法write(定義一個(gè)Pushbutton,點(diǎn)擊來觸發(fā)信息發(fā)送)
6.讀數(shù)據(jù)當(dāng)客戶端有數(shù)據(jù)來,QTcpSocket對(duì)象就會(huì)發(fā)送readyRead信號(hào),關(guān)聯(lián)槽函數(shù)讀取數(shù)據(jù) buffer = tcpsocket->readAll();
二、客戶端:
1.創(chuàng)建QTcpSocket對(duì)象
2.鏈接服務(wù)器connectToHost(QHostAddress(“ip”),端口號(hào))
4.QTcpsocket發(fā)送數(shù)據(jù)用成員方法write(定義一個(gè)Pushbutton,點(diǎn)擊來觸發(fā)信息發(fā)送)
5.讀數(shù)據(jù)當(dāng)客戶端有數(shù)據(jù)來,QTcpSocket對(duì)象就會(huì)發(fā)送readyRead信號(hào),關(guān)聯(lián)槽函數(shù)讀取數(shù)據(jù) buffer = tcpsocket->readAll(); -
運(yùn)行效果圖片:
說明:本人也是Qt初學(xué)者可能有些地方存在錯(cuò)誤,附上程序源碼,希望對(duì)大家學(xué)習(xí)有幫助,歡迎相互交流討論!
- 服務(wù)端程序源碼:`在這里插入代碼片
server.h程序源碼如下:
#ifndef SERVER_H
#define SERVER_H
#include
#include//監(jiān)聽套接字
#include//通信套接字
#include//列表類
QT_BEGIN_NAMESPACE
namespace Ui { class server; }
QT_END_NAMESPACE
class server : public QWidget
{
Q_OBJECT
public:
server(QWidget *parent = nullptr);
~server();
QList<QTcpSocket*> tcpclientlist;
private slots:
void server_New_Connect();
void socket_Read_Data();
void on_pushButton_send_clicked();
void on_pushButton_connect_clicked();
private:
Ui::server *ui;
QTcpServer *tcpserver;
QTcpSocket *tcpsocket;
};
#endif // SERVER_H
server.cpp程序源碼
#include “server.h”
#include “ui_server.h”
-
server::server(QWidget *parent)
-
QWidget(parent)
, ui(new Ui::server)
{
ui->setupUi(this);
}
server::~server()
{
delete ui;
}
void server::on_pushButton_connect_clicked()
{
tcpserver=new QTcpServer(this);
if(ui->pushButton_connect->text() == tr(“連接”))
{
//從輸入框獲取服務(wù)端本地端口號(hào)、ip
int local_port = ui->lineEdit_port->text().toInt();
//監(jiān)聽指定的端口
//監(jiān)聽指定的端口/任意ip
tcpserver->listen(QHostAddress::Any, local_port);
connect(tcpserver,&QTcpServer::newConnection,this,&server::server_New_Connect);//連接信號(hào)槽
//修改按鍵文字
ui->pushButton_connect->setText(“取消連接”);
qDebug()<< “Listen succeessfully!”;
}
else
{
ui->pushButton_connect->setText("連接");
ui->textEdit->append("服務(wù)器端:未連接!");
}
}文章來源地址http://www.zghlxwxcb.cn/news/detail-503779.html
void server::server_New_Connect()
{
//獲取客戶端連接
tcpsocket = tcpserver->nextPendingConnection();
//把新進(jìn)來的客戶端存入列表
tcpclientlist.append(tcpsocket);
//文本框中顯示新的用戶信息
QString ip=tcpsocket->peerAddress().toString();//獲取對(duì)方的ip
quint16 port=tcpsocket->peerPort();//獲取對(duì)方的端口
QString temp=QString(“[%1:%2]客戶端連接成功:”).arg(ip).arg(port);
ui->textEdit->append(temp);
//接收信息
connect(tcpsocket, &QTcpSocket::readyRead, this, &server::socket_Read_Data);
}
void server::socket_Read_Data()//當(dāng)有數(shù)據(jù)過來之后讀數(shù)據(jù)
{
QByteArray buffer;
//利用for循環(huán)循環(huán)列表中的每一個(gè)連接進(jìn)來的客戶端,判斷是哪一個(gè)客戶端發(fā)的數(shù)據(jù)
for(int i = 0; i < tcpclientlist.count(); i++)
{
tcpsocket = tcpclientlist.at(i);
buffer = tcpsocket->readAll();
if(buffer.length()!=0) //如果檢測到接收到的數(shù)據(jù)長度不為0,則代表是這個(gè)客戶端發(fā)送的數(shù)據(jù)
ui->textEdit->append(buffer);
}
buffer = tcpsocket->readAll();//讀取緩沖區(qū)數(shù)據(jù)
QString ip=tcpsocket->peerAddress().toString();//獲取對(duì)方的ip
quint16 port=tcpsocket->peerPort();//獲取對(duì)方的端口
QString temp=QString("客戶端:[%1:%2]").arg(ip).arg(port);
ui->textEdit->append(temp+":"+buffer);
}
void server::on_pushButton_send_clicked()
{
for(int i = 0; i < tcpclientlist.count(); i++)
{
tcpsocket = tcpclientlist.at(i);
if(tcpsocket==NULL)
{
return;
}
//獲取發(fā)送編輯區(qū)內(nèi)容
QString str=ui->textEdit_send->toPlainText();
//寫入writer函數(shù)調(diào)用
tcpsocket->write(str.toUtf8().data());
ui->textEdit->append(“服務(wù)器端:”+str);
}
tcpsocket->flush();
}
`
- 客戶端程序源碼:
在這里插入代碼片
socket.h程序源碼:
#ifndef SOCKET_H
#define SOCKET_H
#include
#include//通信套接字
QT_BEGIN_NAMESPACE
namespace Ui { class socket; }
QT_END_NAMESPACE
class socket : public QWidget
{
Q_OBJECT
public:
socket(QWidget *parent = nullptr);
~socket();
private slots:
void on_pushButton_connect_clicked();
void on_pushButtonSend_clicked();
void socket_Read_Data();
private:
Ui::socket *ui;
QString userName;
QTcpSocket *tcpsocket;
};
#endif // SOCKET_H
socket.cpp程序源碼:
#include “socket.h”
#include “ui_socket.h”
-
socket::socket(QWidget *parent)
-
QWidget(parent)
, ui(new Ui::socket)
{
ui->setupUi(this);
tcpsocket=new QTcpSocket(this);
connect(tcpsocket,&QTcpSocket::readyRead,this,&socket::socket_Read_Data);
}
socket::~socket()
{
delete ui;
}
void socket::socket_Read_Data()//當(dāng)有數(shù)據(jù)過來之后讀數(shù)據(jù)
{
QByteArray buffer;
buffer = tcpsocket->readAll();//讀取緩沖區(qū)數(shù)據(jù)
ui->textEdit->append(“服務(wù)端:”+buffer);//用settext()的話會(huì)覆蓋原來的消息內(nèi)容,所以用append
}
void socket::on_pushButton_connect_clicked()
{
//從界面獲取用戶名
userName = ui->lineEditUserName->text();
//創(chuàng)建一個(gè)通信套接字,用來和服務(wù)器進(jìn)行通信
if(ui->pushButton_connect->text() == tr(“連接”))
{
QString ip=ui->lineEdit_ip->text();//獲取對(duì)方的ip
quint16 port=ui->lineEdit_port->text().toInt();//獲取對(duì)方的端口
tcpsocket->connectToHost(ip,port);
connect(tcpsocket,&QTcpSocket::connected,={
ui->textEdit->append(“Server connect succeessfully!”);
});
ui->pushButton_connect->setText("取消連接");
}
else
{
tcpsocket->disconnectFromHost();
tcpsocket->close();
ui->pushButton_connect->setText("連接");
ui->textEdit->append("客戶端:未連接!");
}
}
void socket::on_pushButtonSend_clicked()
{
if(ui->lineEditSend->text() == “”)
{
return;
}
QString msg = userName + “:” + ui->lineEditSend->text();
tcpsocket->write(msg.toUtf8().data());
ui->textEdit->append(msg);
ui->lineEditSend->clear();文章來源:http://www.zghlxwxcb.cn/news/detail-503779.html
}
到了這里,關(guān)于QT學(xué)習(xí)TCP/IP通信(一個(gè)服務(wù)端對(duì)多個(gè)客戶端)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!