2011-04-24 105 views
0

我正在編寫需要與IPC一起工作的客戶端/服務器應用程序。我已經開發了使用TCPSockets的程序,但現在想嘗試使用消息隊列。服務器只運行到客戶端連接。客戶端連接後,它可以向服務器發送任何整數,然後顯示在服務器上。多個客戶端可以連接到服務器併發送整數,這對服務器和連接的客戶端是可見的。如何在QT中使用QThreads實現POSIX消息傳遞?

如果不使用套接字,我將如何實現這一目標?可以有任何數量的客戶端連接。我正在考慮使用QThread來處理輪詢以查看客戶端是否已連接(?),但這是我卡住的地方 - 您如何告訴客戶端已連接?

回答

0

這不是MQ的特別好用例,但你可以做到。

對消息隊列沒有「連接」的真正概念。從概念上講,它們更像是一個郵箱。您的客戶會在某個時間後放入一封信 - 毫秒數到幾天,具體取決於服務器的設計方式 - 服務器決定打開郵件並對其進行處理。

在您的情況下,您可能會考慮讓客戶端可以發送消息的已知隊列(客戶端知道MQ的路徑)。每個客戶都將創建一個自己的隊列來接收響應。到服務器的消息可能包含客戶端將讀取其響應的隊列的路徑。服務器用整數來響應客戶端的隊列。這將起作用,但它不是你想要擴展到任何程度的東西。

客戶端和服務器都有幾個讀隊列的選項。它們可以在mq_receive中阻塞,直到有東西可讀。他們可以使用mq_timedreceive進行輪詢。當隊列中有新內容時,他們可以使用mq_notify接收信號(或創建一個線程)。或者,在Linux上,他們可以在select(或類似)語句中使用mqd_t。

1

看到這個問題,我問關於建立「連接」使用POSIX消息隊列: Using POSIX message queues instead of TCP sockets - how to establish "connection"?

我沒有得到它的工作,但最終開發了Unix域套接字,這給了加速支持,我與MQ喜歡,但沒有實施複雜性。現在,由於某種原因,你在你的問題中提到「不使用套接字」,所以我不知道你是否可以使用Unix域套接字替代TCP而不是使用MQ,但是如果你願意嘗試,我可以推薦它。 Unix域套接字確實支持面向連接的操作(以及無連接),所以如何知道連接何時建立或斷開的問題不需要複雜的應用程序(與TCP相同)。