2017-05-10 16:40
25人閱讀收藏
編輯刪除
qt(24)
作者同類文章x
而對於伺服器來說,多執行緒的這個特性太有用了,因為多執行緒使得伺服器可能同時響應多個客戶端的請求,所以現在伺服器大多採用多執行緒,所以才會造成我開始的誤解。
不管是多執行緒,還是伺服器,qt中已經封裝好了特定的類,所以使用起來也很方便。
下面建立乙個支援多執行緒、tcp的伺服器。
首先建立乙個伺服器。新建乙個類(server)繼承qt中的qtcpserver類即可。伺服器的職責是監聽埠。當監聽到有客戶端試圖與伺服器建立連線的時候,分配socket與客戶端連線,再進行資料通訊。qtcpserver的listen()方法執行監聽過程,可以指定監聽的位址和埠。若給定了qhostaddress型別的監聽位址,則監聽該位址,否則,監聽所有位址;若給定了quint16型別的監聽埠,則監聽該埠,否則,隨機選定乙個監聽埠。
[cpp]view plain
copy
?server * server = new server;
if(!server->listen(host,port))
[cpp]view plain
copy
?server * server = new server;
if(!server->listen(host,port))
server * server = new server;
if(!server->listen(host,port))
qtcpserver有乙個虛函式incomingconnection(int socketdescriptor),伺服器每當監聽到乙個客戶端試圖建立連線的時候,會自動呼叫這個函式,因此,處理這個請求的過程就可以在這個函式中進行,即在子類server的定義階段,重新定義incomingconnection()這個函式。對於乙個多執行緒的伺服器,每當客戶端試圖連線的時候,伺服器應該啟動乙個執行緒,負責對這個客戶端進行服務,所以,incomingconnection()這個函式所要做的就是建立乙個執行緒,而所建立的執行緒的作用就是對客戶端進行服務,而這其中建立socket連線是基礎。伺服器在監聽到客戶端試圖建立socket連線時,會為此socket分配乙個唯一的標識socketdescriptor,這個標識將在伺服器端建立socket連線時使用,所以應提供給每乙個執行緒。
在qt中使用多執行緒,建立乙個類(thread)繼承qthread類即可。qthread類也有乙個虛函式,這個函式是run(),執行緒建立並啟動(qthread::start())後,就會執行這裡面的**,因此,執行緒的邏輯過程就應該在run()裡面定義。伺服器的執行緒要根據socketdescriptor標識的socket建立連線,然後進行資料通訊,所以要將socketdescriptor傳入到thread中,前面說過,執行緒是在incomingconnection()裡面建立,用建構函式將socketdescriptor傳入thread類,再用socketdescriptor建立socket連線。
定義incomingconnection()
[cpp]view plain
copy
?void incomingconnection(int socketdescriptor)
[cpp]view plain
copy
?void incomingconnection(int socketdescriptor)
void incomingconnection(int socketdescriptor)
定義run()
[cpp]view plain
copy
?void run()
[cpp]view plain
copy
?void run()
void run()
自此,乙個簡單的多執行緒伺服器建立完畢。
頂
0 踩
0 我的同類文章
qt(24)
Qt多執行緒程式設計中的物件執行緒與函式執行執行緒
為了更清楚的理解這些問題,在此特編了個小例子說明一下。首先定義乙個從qobject繼承的類someobject,包含乙個訊號somesignal和乙個成員函式callemitsignal,此函式用於傳送前面的somesignal訊號。定義如下 define object class class so...
Qt中的多執行緒程式設計
qt中的多執行緒程式設計 qthread 類,該類提供了建立乙個新執行緒以及控制線程執行的各種方法。執行緒是通過 qthread run 過載函式開始執行的 在 qt 系統中,始終執行著乙個gui 主事件執行緒,這個主線程從視窗系統中獲取事件,並將它們分發到各個元件去處理。在 qthread 類中還...
Qt中的多執行緒程式設計
1.業務類 1.1要在子執行緒中處理的業務操作抽象成乙個類 subthreadwork 繼承於qobject 1.2在類subthreadwork中自定義乙個業務處理函式 dosubthreadwork 1.3在類subthreadwork中自宣告訊號 signalsubthreadwork 通過自...