QT中 實現乙個服務端接收兩個客戶端的解決方法

2021-08-18 12:44:38 字數 2226 閱讀 8413

最近自己在折騰qt中實現tcp服務端的過程中,發現以往的例子都是點對點的,也就是說大都是乙個客戶端,乙個服務端,然後兩個進行通訊,而對於單個服務端與多個客戶端的通訊,非常稀少,找到乙個但對於我們新手來說,有點複雜,不好理解,下面我介紹乙個新手也能明白的一種解決方案。

下面是mainwindow.h

#ifndef mainwindow_h

#define mainwindow_h

#include #include #include namespace ui

class mainwindow : public qmainwindow

;#endif // mainwindow_h

下面是main.cpp

#include "mainwindow.h"

下面是mainwindow.cpp
#include "mainwindow.h"

#include "ui_mainwindow.h"

#include int connect_num=0;

mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

//signal(clientreaddata(int,qstring,int,qbytearray))

mainwindow::~mainwindow()

void mainwindow::on_pushbutton_listen_clicked()

// if(!server->listen(qhostaddress::any, port1))

//

//修改按鍵文字

ui->pushbutton_listen->settext("取消偵聽");

qdebug()<< "listen succeessfully!";

}else

//取消偵聽

server->close();

//修改按鍵文字

ui->pushbutton_listen->settext("偵聽");

//傳送按鍵失能

ui->pushbutton_send->setenabled(false);

}}void mainwindow::on_pushbutton_send_clicked()

void mainwindow::clientreaddata(/*int clientid,qstring ip,int port,qbytearray data*/)

void mainwindow::server_new_connect()//沒接入乙個都會響應一次

// socket = server->nextpendingconnection();

//連線qtcpsocket的訊號槽,以讀取新資料

// qobject::connect(socket, &qtcpsocket::readyread, this, &mainwindow::socket_read_data);//前面是訊號 後面是槽函式

// qobject::connect(socket, &qtcpsocket::disconnected, this, &mainwindow::socket_disconnected);

//傳送按鍵使能

if(connect_num==2)

// qdebug() << "a client connect!";

}void mainwindow::socket_read_data()

}void mainwindow::socket2_read_data()

}void mainwindow::socket_disconnected()

下面是介面檔案

主要的是下面這個方法

server_new_connect() 與newconnection 這個訊號連線,而這個訊號一旦有客戶端連線上就會響應一次,而響應一次就在server_new_connect()這個方法裡面+1,

然後與相應的客戶端建立連線

connect_num=1的與對應的連線 connect_num=2的與對應的連線

兩個棧實現乙個佇列 兩個佇列實現乙個棧

這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將top元素push到stack 2中,然後將stack 1 pop一次直到stack 1剩下最後乙個元素,這個就是最先push進去的,我們把它pop掉就可以了,同理,我們求queue的fro...

兩個棧實現乙個佇列,兩個佇列實現乙個棧

1 兩個棧實現乙個佇列 入隊時,直接壓入stack1中。出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素。入隊操作 void enqueue stack s1,stack s2,int m 出隊操作 void deq...

兩個棧實現乙個佇列 兩個佇列實現乙個棧

方法一 public class main 出棧操作 public int deletehead while stack1.isempty return stack2.pop 方法二 public class main public int deletehead throws exception i...