#include "TcpServer.h"
#include "ui_TcpServer.h"
#define MAXNUM 100 //最大监听数
TcpServer::TcpServer(QWidget *parent) :
QWidget(parent),
ui(new Ui::TcpServer)
{
ui->setupUi(this);
Init();
}
TcpServer::~TcpServer()
{
delete ui;
}
/*===========================================function=============================================*/
void TcpServer::Init()
{
myServer = new QTcpServer(this);
}
/*=========================================end function===========================================*/
/*=============================================slot===============================================*/
void TcpServer::on_pushButton_Bind_clicked()
{
QString serverIP;
QString serverPort;
QString msg;
/********************************方法一:自动获取IP*****************************/
QList<QHostAddress> addrs = QNetworkInterface::allAddresses();
for(int i=0;i<addrs.length();i++){
QHostAddress addr = addrs.at(i);
if(addr.toString().contains("192.")){
serverIP = addr.toString();
ui->lineEdit_ServerIp->setText(serverIP);
break;
}
}
/********************************方法二:手动设置IP*****************************/
// serverIP = ui->lineEdit_ServerIp->text();
serverPort = ui->lineEdit_ServerPort->text();
//绑定IP、端口
bool ret = myServer->listen(QHostAddress(serverIP),serverPort.toUInt());
if(!ret){
msg = "绑定失败!";
}
else{
msg = "绑定成功!";
ui->pushButton_Bind->setEnabled(false);
}
ui->textEdit_Server->append(msg);
myServer->setMaxPendingConnections(MAXNUM); //设置最大监听数
connect(myServer,SIGNAL(newConnection()),this,SLOT(doProcessNewConnection()));
}
//新客户端连接请求处理
void TcpServer::doProcessNewConnection()
{
client = myServer->nextPendingConnection(); //获取客户端连接的描述符
arrayClient.append(client); //存入客户端buffer
ui->lineEdit_clientIP->setText(client->peerAddress().toString());
//客户端连接
connect(client,SIGNAL(connected()),this,SLOT(doProcessConnected()));
//客户端断开
connect(client,SIGNAL(disconnected()),this,SLOT(doProcessDisconnected()));
//读取内容
connect(client,SIGNAL(readyRead()),this,SLOT(doProcessreadyRead()));
}
//新客户端成功接入
void TcpServer::doProcessConnected()
{
QTcpSocket *client = (QTcpSocket*)this->sender();
QString msg = QString("客户端[%1:%2]成功接入!")
.arg(client->peerAddress().toString())
.arg(client->peerPort());
ui->textEdit_Server->append(msg);
}
//客户端断开
void TcpServer::doProcessDisconnected()
{
QTcpSocket *client = (QTcpSocket*)this->sender(); //QObject * QObject::sender ()在信号激活的槽中调用,返回发送信号的对象的指针
QString msg = QString("客户端[%1:%2]断开!")
.arg(client->peerAddress().toString())
.arg(client->peerPort());
ui->textEdit_Server->append(msg);
//删除对应客户端
for(int i=0;i<arrayClient.length();i++){
if(arrayClient.at(i)->peerAddress() == client->peerAddress()){
if(arrayClient.at(i)->peerPort() == client->peerPort()){
arrayClient.removeAt(i);
break;
}
}
}
}
//接收数据
void TcpServer::doProcessreadyRead(){
QTcpSocket *client = (QTcpSocket*)this->sender();
QString msg = QString("来自客户端[%1:%2]:")
.arg(client->peerAddress().toString())
.arg(client->peerPort());
ui->textEdit_Server->append(msg);
while(!client->atEnd()){
QString recv = QString(client->readAll());
ui->textEdit_Server->append(recv);
}
}
//发送数据
void TcpServer::on_pushButton_sendToClient_clicked()
{
QString ip = ui->lineEdit_clientIP->text();
QString port = ui->lineEdit_clientPort->text();
//发送文本数据
// //遍历列表,查找对应客户端
// for(int i=0;i<arrayClient.length();i++){
// if((arrayClient.at(i)->peerAddress()).toString() == ip){
// if(arrayClient.at(i)->peerPort() == port.toUInt()){
// QString msg = ui->textEdit_Client->toPlainText();
// arrayClient.at(i)->write(msg.toUtf8());
// ui->textEdit_Client->clear();
// break;
// }
// }
// }
//发送图像数据
QPixmap img;
img.load(":/img/text.jpg");
QByteArray array;
QBuffer buffer;
buffer.open(QIODevice::ReadWrite);
img.save(&buffer,"JPG");
array.append(buffer.data());
//遍历列表,查找对应客户端
for(int i=0;i<arrayClient.length();i++){
if((arrayClient.at(i)->peerAddress()).toString() == ip){
if(arrayClient.at(i)->peerPort() == port.toUInt()){
arrayClient.at(i)->write(array);
break;
}
}
}
}
void TcpServer::on_pushButton_clearRecv_clicked()
{
ui->textEdit_Server->clear();
}
/*===========================================end slot=============================================*/
Linux+Ubuntu+QT Tcp通信,分为客户端和服务端
需积分: 5 152 浏览量
2022-04-27
09:28:46
上传
评论 9
收藏 1.76MB ZIP 举报
rbfunny2021
- 粉丝: 1
- 资源: 8
最新资源
- JSP-JTBC-CMS(SQLITE).rar
- MC3362和MC145151调频无线接收器的设计.pdf
- MiniRenamer-v100.0一款简单易用的批量文件重命名工具(已注册PRO版本).rar
- 小狐狸Ai系统 小狐狸ai付费创作系统V2.8.0 ChatGPT智能机器人
- 公孙离-内衣-肚兜.zipgsl
- 快慢指针判断链表是否有环-go 语言实现
- 学生成绩管理系统的设计与实现-收藏备用.pdf
- JSP+SQL网站流量统计管理系统(源代码+论文).rar
- IBM-PC-XT微机过程...道中模拟量数据的采集和处理.pdf
- JSP+SQL网上选课系统(源代码+论文+答辩PPT).rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0