服务端
流程
(1)使用QT的网络通信需要在.pro中加入:
QT += network
(2)创建QTcpServer 对象(监听套接字):
server = new QTcpServer
(3)监听
server->listen(QHostAddress::Any,PORT)
(4)当服务器被客户端连接(访问)时,会发出newConnection()信号:
this->connect(server,SIGNAL(newConnection()),this,SLOT(server_New_Connect()));
void MainWindow::server_New_Connect()//连接
{
//获取客户端连接
socket = server->nextPendingConnection();
}
(5)使用socket的 write函数向客户端发送数据
socket->write(data);
(6)当客户端有数据到来时,会发出readyRead()函数,因此为该信号添加槽来处理接收额数据:
this->connect(socket,SIGNAL(readyRead()),this,SLOT(socket_Read_Data()));
void MainWindow::socket_Read_Data()//读取服务端发送的数据
{
QByteArray buffer;
//读取缓冲数据
buffer = socket->readAll();
}
(7)取消侦听
server->close();
(8)客户端与服务器断开连接时,会发出disconnected()信号,因此添加槽来处理先关信息:
this->connect(socket,SIGNAL(disconnected()),this,SLOT(socket_Disconnected()));
void MainWindow::socket_Disconnected()//服务端断开连接时的槽
{
qDebug()<<“Disconnected!”;
}
具体实现
(1)界面设计
(2)定义
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "QTcpServer"
#include "QTcpSocket"
#include "QtDebug"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_Listen_clicked();//监听
void on_pushButton_Send_clicked();//发送
void server_New_Connect();//连接
void socket_Read_Data();//读取数据
void socket_Disconnected();//断开连接
private:
Ui::MainWindow *ui;
public:
QTcpServer *server;//监听套接字
QTcpSocket *socket;//数据套接字
QList<QTcpSocket*>m_sList;//
};
#endif // MAINWINDOW_H
(3)实现
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit_PORT->setText("8765");
ui->pushButton_Send->setEnabled(false);
server = new QTcpServer;
//连接信号与槽
this->connect(server,SIGNAL(newConnection()),this,SLOT(server_New_Connect()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_Listen_clicked()
{
if(ui->pushButton_Listen->text() == "侦听")
{
//从输入框获取端口号
int PORT = ui->lineEdit_PORT->text().toInt();
//监听
if(!server->listen(QHostAddress::Any,PORT))
{
//若出错,输出错误信息
qDebug()<<server->errorString();
return ;
}
ui->pushButton_Listen->setText("取消侦听");
qDebug()<<"Listen Successfully";
}
else
{
//如果正在连接(点击侦听后立即取消侦听,若socket没有指定对象会有异常)
if(socket->state() == QAbstractSocket::ConnectedState)
{
//关闭连接
socket->disconnectFromHost();
}
//取消侦听
server->close();
//修改按键文字
ui->pushButton_Listen->setText("侦听");
//设置按键失能
ui->pushButton_Send->setEnabled(false);
}
}
void MainWindow::server_New_Connect()//连接
{
//获取客户端连接
socket = server->nextPendingConnection();
m_sList.append(socket);//将所有的连接过来的socket保存下来
//连接QTcpSocket的信号槽,以读取新数据
qDebug()<<socket->peerAddress()<<"Port"<<socket->peerPort();
this->connect(socket,SIGNAL(readyRead()),this,SLOT(socket_Read_Data()));//数据发送时
this->connect(socket,SIGNAL(disconnected()),this,SLOT(socket_Disconnected()));//断开连接时
//发送键使能
ui->pushButton_Send->setEnabled(true);
socket->write("Hello Client"+QString::number(socket->peerPort()).toLocal8Bit());//发送连接成功信息
ui->textEdit_Reca->insertPlainText(QString::number(socket->peerPort())+"成功连接\n");
qDebug()<<"A Client Connect";
}
void MainWindow::on_pushButton_Send_clicked()
{
qDebug()<<"Send:"<<ui->textEdit_Send->toPlainText();
//获取文本内容以toLocal8Bit码形式发送
foreach(QTcpSocket *m_ss,m_sList)//发送给所有客户端
{
m_ss->write(ui->textEdit_Send->toPlainText().toLocal8Bit());//toLocal8Bit中英不乱码
m_ss->flush();//清空缓存,马上发送消息(可以不写)
}
}
void MainWindow::socket_Read_Data()//读取客户端发送的数据
{
QByteArray buffer;
//读取缓冲数据
foreach(QTcpSocket *m_ss,m_sList)//只要客户端的数据发送过来就读取
{
buffer = m_ss->readAll();
if(!buffer.isEmpty())
{
int intport = m_ss->peerPort();//得到端口
QString strport = QString::number(intport);
//insertPlainText插入数据到文字的后方
ui->textEdit_Reca->insertPlainText(strport+":"+buffer+"\n");
}
}
}
void MainWindow::socket_Disconnected()
{
//按键失能
// ui->pushButton_Send->setEnabled(false);
QTcpSocket *st = qobject_cast<QTcpSocket*>(sender());//得到当前与服务端交互的客户端的套接字
ui->textEdit_Reca->insertPlainText(QString::number(st->peerPort())+"断开连接\n");
m_sList.removeAll(st);//将断开连接的套接字移除
foreach(QTcpSocket *m_ss,m_sList)
{
qDebug()<<m_ss->peerAddress()<<"Port"<<m_ss->peerPort();
}
qDebug()<<"Disconnected!";
}