当前位置: 首页 > news >正文

自媒体网站源码模板dedewordpress博客名字

自媒体网站源码模板dede,wordpress博客名字,营销网站与企业网站的区别,郑州app推广公司QT示例#xff1a;基于TCP 点对多通讯#xff08;server,clients#xff09;一、服务器server二、客户端Client下载#xff1a;基于TCP 点对多Socket通讯 一、服务器server 因为对于客户端来说#xff0c;只能连接一个服务器。而对于服务器来说#xff0c;它是面向多连… QT示例基于TCP 点对多通讯server,clients一、服务器server二、客户端Client下载基于TCP 点对多Socket通讯 一、服务器server 因为对于客户端来说只能连接一个服务器。而对于服务器来说它是面向多连接的如何协调处理多客户端连接就显得尤为重要。 注意问题 每个新加入的客户端服务器给其分配一个SocketDescriptor后就会emit newConnection()信号但分配好的SocketDecriptor并没有通过newConnection()信号传递所以用户得不到这个客户端标识SocketDescriptor。同样的每当服务器收到新的消息时客户端会emit readReady()信号然而readReady()信号也没有传递SocketDescriptor 这样的话服务器端即使接收到消息也不知道这个消息是从哪个客户端发出的。解决的方法 通过重写[virtual protected] void QTcpServer::incomingConnection(qintptr socketDescriptor)获取soketDescriptor。自定义TcpClient类继承QTcpSocket并将获得的soketDescriptor作为类成员。 这个方法的优点是可以获取到soketDescriptor灵活性高。缺点是需要重写函数、自定义类。在newConnection()信号对应的槽函数中通过QTcpSocket *QTcpServer::nextPendingConnection()函数获取 新连接的客户端Returns the next pending connection as a connected QTcpSocket object. 虽然仍然得不到soketDescriptor**但可以通过QTcpSocket类的peerAddress()和peerPort()成员函数获取客户端的IP和端口号同样是唯一标识。 **优点无需重写函数和自定义类代码简洁。缺点无法获得SocketDecriptor灵活性差。 本文示例为第二种方法 1.pro 添加 QT network2主函数 main.cpp 添加 #include mytcpserver.h #include QApplicationint main(int argc, char *argv[]) {QApplication a(argc, argv);MyTcpServer w;w.show();return a.exec(); }3MyTcpServer.h 添加 #include mytcpserver.h #include ui_mytcpserver.hMyTcpServer::MyTcpServer(QWidget *parent) :QMainWindow(parent),ui(new Ui::MyTcpServer) {ui-setupUi(this);// 一 、创建QTcpSever对象;tcpServer new QTcpServer(this);ui-edtIP-setText(QNetworkInterface().allAddresses().at(1).toString()); //获取本地IPui-btnConnect-setEnabled(true);ui-btnSend-setEnabled(false);// 设置默认按钮样式ui-btnConnect-setStyleSheet();connect(tcpServer, QTcpServer::newConnection, this, MyTcpServer::NewConnectionSlot); }MyTcpServer::~MyTcpServer() {delete ui; }// 二、监听--断开 void MyTcpServer::on_btnConnect_clicked() {if(ui-btnConnect-text()监听){bool ok tcpServer-listen(QHostAddress::Any, ui-edtPort-text().toInt());if(ok){ui-btnConnect-setText(断开);ui-btnConnect-setStyleSheet(color: red;);ui-btnSend-setEnabled(true);}}else{for(int i0; itcpClient.length(); i) // 断开所有连接{tcpClient[i]-disconnectFromHost();bool ok tcpClient[i]-waitForDisconnected(1000);if(!ok){// 处理异常QMessageBox::warning(this, tr(错误),tr(断开连接失败), QMessageBox::Ok);}tcpClient.removeAt(i); // 从保存的客户端列表中取去除}tcpServer-close(); // 不再监听端口ui-btnConnect-setText(监听);ui-btnConnect-setStyleSheet();ui-btnSend-setEnabled(false);} }// 三、新连接建立的槽函数 void MyTcpServer::NewConnectionSlot() {currentClient tcpServer-nextPendingConnection();tcpClient.append(currentClient);ui-cbxConnection-addItem(tr(%1:%2).arg(currentClient-peerAddress().toString().split(::ffff:)[1]).arg(currentClient-peerPort()));connect(currentClient, QTcpSocket::readyRead, this, MyTcpServer::ReadData);connect(currentClient, QTcpSocket::disconnected, this, MyTcpServer::disconnectedSlot); }// 四、客户端数据可读信号对应的读数据槽函数 void MyTcpServer::ReadData() {// 由于readyRead信号并未提供SocketDecriptor所以需要遍历所有客户端for(int i0; itcpClient.length(); i){QByteArray buffer tcpClient[i]-readAll();if(buffer.isEmpty()) // 客户端 数据为空则跳过continue;// 客户端有数据则 获取IP 和端口static QString IP_Port, IP_Port_Pre;IP_Port tr([%1:%2]:).arg(tcpClient[i]-peerAddress().toString().split(::ffff:)[1]).arg(tcpClient[i]-peerPort());// 若此次消息的地址与上次不同则需显示此次消息的客户端地址if(IP_Port ! IP_Port_Pre)ui-edtRecv-append(IP_Port);ui-edtRecv-append(buffer);//更新ip_portIP_Port_Pre IP_Port;} }// 五、断开连接的槽函数 void MyTcpServer::disconnectedSlot() {//由于disconnected信号并未提供SocketDescriptor所以需要遍历寻找for(int i0; itcpClient.length(); i){if(tcpClient[i]-state() QAbstractSocket::UnconnectedState){// 删除存储在combox中的客户端信息ui-cbxConnection-removeItem(ui-cbxConnection-findText(tr(%1:%2).arg(tcpClient[i]-peerAddress().toString().split(::ffff:)[1]).arg(tcpClient[i]-peerPort())));// 删除存储在tcpClient列表中的客户端信息tcpClient[i]-destroyed();tcpClient.removeAt(i);}} }// 六、发送数据 void MyTcpServer::on_btnSend_clicked() {QString data ui-edtSend-toPlainText();if(data )return; // 文本输入框为空时//全部连接if(ui-cbxConnection-currentIndex() 0){for(int i0; itcpClient.length(); i)tcpClient[i]-write(data.toLatin1()); //qt5除去了.toAscii()}//指定连接else{QString clientIP ui-cbxConnection-currentText().split(:)[0]; // IP 地址int clientPort ui-cbxConnection-currentText().split(:)[1].toInt(); // port 端口号 // qDebug() clientIP; // qDebug() clientPort;for(int i0; itcpClient.length(); i){if(tcpClient[i]-peerAddress().toString().split(::ffff:)[1]clientIP tcpClient[i]-peerPort()clientPort){tcpClient[i]-write(data.toLatin1());return; //ip:port唯一无需继续检索}}} }// 清楚窗口 void MyTcpServer::on_btnClear_clicked() {ui-edtRecv-clear(); } 5界面 mytcpserver.ui 二、客户端Client 1.pro 添加 QT network2主函数 main.cpp 添加 #include mytcpclient.h #include QApplicationint main(int argc, char *argv[]) {QApplication a(argc, argv);MyTcpClient w;w.show();return a.exec(); } 3MyTcpClient.h 添加 #include QMainWindow #include QTcpSocket #include QHostAddress #include QMessageBoxnamespace Ui { class MyTcpClient; }class MyTcpClient : public QMainWindow {Q_OBJECTpublic:explicit MyTcpClient(QWidget *parent 0);~MyTcpClient();private:Ui::MyTcpClient *ui;QTcpSocket *tcpClient;private slots://客户端槽函数void ReadData();void ReadError(QAbstractSocket::SocketError);void on_btnConnect_clicked();void on_btnSend_clicked();void on_pushButton_clicked(); };4MyTcpClient.cpp 添加 #include mytcpclient.h #include ui_mytcpclient.hMyTcpClient::MyTcpClient(QWidget *parent) :QMainWindow(parent),ui(new Ui::MyTcpClient) {ui-setupUi(this);// 一、初始化TCP客户端tcpClient new QTcpSocket(this); //实例化tcpClienttcpClient-abort(); //取消原有连接ui-btnConnect-setEnabled(true);ui-btnSend-setEnabled(false);connect(tcpClient, QTcpSocket::readyRead, this, MyTcpClient::ReadData);connect(tcpClient, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(ReadError(QAbstractSocket::SocketError))); }MyTcpClient::~MyTcpClient() {delete ui; }// 二、连接 void MyTcpClient::on_btnConnect_clicked() {if(ui-btnConnect-text()连接){tcpClient-connectToHost(ui-edtIP-text(), ui-edtPort-text().toInt());if (tcpClient-waitForConnected(1000)) // 连接成功则进入if{}{ui-btnConnect-setText(断开);ui-btnSend-setEnabled(true);}}else{tcpClient-disconnectFromHost();if (tcpClient-state() QAbstractSocket::UnconnectedState || tcpClient-waitForDisconnected(1000)) //已断开连接则进入if{}{ui-btnConnect-setText(连接);ui-btnSend-setEnabled(false);}} }// 三、读取数据 void MyTcpClient::ReadData() {QByteArray buffer tcpClient-readAll();if(!buffer.isEmpty()){ui-edtRecv-append(buffer);} }// 四、发送数据 void MyTcpClient::on_btnSend_clicked() {QString data ui-edtSend-toPlainText();if(data ! ){tcpClient-write(data.toLatin1()); //qt5出去了.toAscii()} }// 连接错误信息处理 void MyTcpClient::ReadError(QAbstractSocket::SocketError) {tcpClient-disconnectFromHost();ui-btnConnect-setText(tr(连接));QMessageBox msgBox;msgBox.setText(tr(failed to connect server because %1).arg(tcpClient-errorString()));msgBox.exec(); }// 清空按钮 void MyTcpClient::on_pushButton_clicked() {ui-edtRecv-clear(); } 2mytcpclient.ui 添加 参考博客 QT 之TCP网络编程
http://www.zqtcl.cn/news/332522/

相关文章:

  • 唐山网站建设方案优化国内酷炫网站
  • 国外网站备案吗网站做一样没有侵权吧
  • 谷歌怎么建网站ps中怎样做网站轮播图片
  • 汕头有没有做网站廊坊宣传片制作公司
  • 百度快速收录网站有些人做网站不用钱的 对吗
  • 如何规划一个网站网站建设预付费入什么科目
  • 北京做网站的好公司有哪些网站建设杭州缘择低价
  • 建设网站团队张掖响应式建站平台
  • 中国建设之乡是哪里网站优化连云港哪家强?
  • 网站建设报价是多少30号长沙封城最新消息
  • 常州专业网站建设费用电商推广技巧
  • 辽源市网站建设南通营销网站开发
  • 新站优化案例去韩国用什么地图导航
  • 宁波网站制作与推广WordPress怎么文章分类
  • mvc 做网站国内的搜索引擎有哪些
  • 设计视频网站腾讯云服务器网站域名备案
  • 网站建设费算费用还是固定资产镇赉县做网站的
  • 山西 旅游 英文 网站建设wordpress 设置登陆界面
  • 电商网站系统建设考试深圳网站建设培训哪家好
  • 工作室 网站项目策划书八篇案例
  • ui做网站流程建设统计网站进不去
  • 沧州网站建设优化公司网站改版
  • 网站开发工程师好不好注册科技公司流程和费用
  • wordpress站点费用vs手表官网
  • 网站买卖需要注意什么景安怎么把网站做别名
  • 网站建设网站建怎么做一个门户网站
  • 站长工具域名备案查询安卓app开发教程视频免费
  • 赶集网网站建设分析河南郑州旅游网站设计
  • 怎么可以黑网站域名建设网站的网站是什么
  • 帝国网站数据库配置文件建筑人才网招聘网官网首页