QT实现tcp通信(Server服务器端)
右键点击列表连接的IP可以弹出删除按钮。
客户端参考https://txwtech.blog.csdn.net/article/details/125388830?spm=1001.2014.3001.5502
QT_TCP_server_full服务器端.rar-QT文档类资源-CSDN下载QT_TCP_server_full服务器端.rarhttps://blog.csdn.net/t更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/txwtech/86269840
头文件:
#ifndef SERVER_H
#define SERVER_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Server;
}
QT_END_NAMESPACE
class QTcpServer;
class Server : public QMainWindow
{
Q_OBJECT
public:
Server(QWidget *parent = nullptr);
~Server();
private:
Ui::Server *ui;
QTcpServer *tcpServer;
QTcpSocket *client;
QList tcpClients;
QListWidgetItem *lwdgitem;
QMenu *iplistMenu;
QAction* actiondel = NULL;
private slots:
QString GetLocalIP();
void on_pushButton_StartToListen_clicked();
//void on_listView_IP_List_customContextMenuRequested(const QPoint &pos);
void on_listWidget_IP_customContextMenuRequested(const QPoint &pos);
void slot_newConnectionClient();
void slot_readData();
void slot_disconnectedClient();
void on_pushButton_Send_clicked();
void slot_delmenu();
};
#endif // SERVER_H
源文件:
#include "server.h"
#include "ui_server.h"
#include //在pro文件里面添加QT+=network
#include
Server::Server(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::Server)
{
ui->setupUi(this);
tcpServer=new QTcpServer(this);
QString ip = GetLocalIP();
if(ip.isEmpty())
{
QMessageBox::about(this,tr("提示"),tr("没有获取到本机的IP"));
}
else
{
ui->lineEdit_Local_IP->setText(ip);
}
// QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
ui->listWidget_IP->setContextMenuPolicy(Qt::CustomContextMenu);//右键点击,弹出菜单
ui->label_hostName->setText(tr("HostName:")+QHostInfo::localHostName());
ui->label_hostName->adjustSize();
ui->lineEdit_Local_Port->setText(tr("6666"));
ui->plainTextEdit_Send_Msg->setPlainText("I am Server您好");
ui->pushButton_StartToListen->setEnabled(true);
ui->pushButton_Send->setEnabled(false);
iplistMenu=new QMenu(ui->listWidget_IP);//菜单绑定到列表控件,by txwtech
// QAction *pnew0 = new QAction(QString::fromLocal8Bit("Delete"),ui->listWidget_IP);
QAction *pnew0 = new QAction("删除",ui->listWidget_IP);
iplistMenu->addAction(pnew0);
// connect( ui->actiondel, SIGNAL(triggered()), this, SLOT(slot_delmenu()));
connect( pnew0, SIGNAL(triggered()), this, SLOT(slot_delmenu()));
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(slot_newConnectionClient()));
}
//“删除”菜单,断开指定Client
void Server:: slot_delmenu()
{
if( lwdgitem != NULL )
{
if( !tcpClients.isEmpty() ){
QString clientIP = lwdgitem->text().split(":")[0];
int clientPort = lwdgitem->text().split(":")[1].toInt();
for(int i=0; ipeerAddress().toString()==clientIP && tcpClients[i]->peerPort()==clientPort)
{
tcpClients[i]->disconnectFromHost();
break;
}
}
}
}
}
void Server::slot_newConnectionClient()
{
while(tcpServer->hasPendingConnections())
{
QTcpSocket *client=tcpServer->nextPendingConnection();
tcpClients.append(client);
ui->listWidget_IP->addItem(tr("%1:%2").arg(client->peerAddress().toString()).arg(client->peerPort()));
connect(client,SIGNAL(readyRead()),this,SLOT(slot_readData()));
connect(client,SIGNAL(disconnected()),this,SLOT(slot_disconnectedClient()));
}
}
void Server::slot_readData()
{
QTcpSocket *obj=(QTcpSocket*)sender();
QByteArray buf=obj->readAll();
if(buf.isEmpty())
return;
QString ipc;
ipc=tr("[%1:%2]").arg(obj->peerAddress().toString()).arg(obj->peerPort());
ui->textEdit_Recv_Msg->append(ipc);
// ui->textEdit_Recv_Msg->append(QString::fromLocal8Bit(buf));
// toUtf8
ui->plainTextEdit_Recv_Msg->appendPlainText(ipc);
ui->plainTextEdit_Recv_Msg->appendPlainText(QString::fromLocal8Bit(buf)); //fromLocal8Bit显示中文,解决乱码
}
void Server::slot_disconnectedClient()
{
if(!tcpClients.isEmpty())
{
QTcpSocket *obj=(QTcpSocket*) sender();
QListWidgetItem *item=ui->listWidget_IP->findItems(
tr("%1:%2")\
.arg( obj->peerAddress().toString())\
.arg( obj->peerPort()),Qt::MatchContains|Qt::MatchEndsWith
).at(0);
ui->listWidget_IP->removeItemWidget(item);
delete item;
obj->close();
tcpClients.removeOne(obj);
}
}
QString Server::GetLocalIP()
{
QList list=QNetworkInterface::allAddresses();
foreach(QHostAddress address,list)
{
if(address.protocol()==QAbstractSocket::IPv4Protocol)
{
return address.toString();
}
}
return "";
}
Server::~Server()
{
delete ui;
}
void Server::on_pushButton_StartToListen_clicked()
{
if(ui->pushButton_StartToListen->text()=="停止")
{
if(!tcpClients.isEmpty())
for(int i=0;idisconnectFromHost();
}
tcpClients.clear();
tcpServer->close();
ui->listWidget_IP->clear();
ui->pushButton_StartToListen->setText("监听");
ui->pushButton_Send->setEnabled(false);
}
else
{
if(ui->lineEdit_Local_Port->text().toInt()==0)
{
QMessageBox::about(this,tr("提示"),tr("请输入端口号"));
}
else if(tcpServer->listen(QHostAddress::AnyIPv4,ui->lineEdit_Local_Port->text().toInt()))
{
ui->pushButton_StartToListen->setText("停止");
ui->pushButton_Send->setEnabled(true);
}
}
}
void Server::on_listWidget_IP_customContextMenuRequested(const QPoint &pos)
{
lwdgitem = ui->listWidget_IP->itemAt(pos);
if(lwdgitem!=NULL)
{
iplistMenu->exec(QCursor::pos());
}
}
void Server::on_pushButton_Send_clicked()
{
if(ui->listWidget_IP->selectedItems().length()>0)
{
foreach(QListWidgetItem* item, ui->listWidget_IP->selectedItems())
{
QString clientIP=item->text().split(":")[0];
int clientPort=item->text().split(":")[1].toInt();
for(int i=0;ipeerAddress().toString()==clientIP &&tcpClients[i]->peerPort()==clientPort)
{
// tcpClients[i]->write(ui->plainTextEdit_Send_Msg->toPlainText().toUtf8());
tcpClients[i]->write(ui->plainTextEdit_Send_Msg->toPlainText().toLocal8Bit());fromLocal8Bit显示中文,解决乱码
}
}
}
}
else
{
QMessageBox::information(this,"提示","IP列表未选择");
}
}