2016-12-04 71 views
0

我正在嘗試使用python(可能稍後會在c)和TCP套接字進行本地網絡聊天程序。結合服務器和客戶端python套接字

我的意圖是讓服務器偵聽當前計算機的傳入消息地址,並將這些地址轉發給客戶端(我目前還不確定)。 客戶端將是一個簡單的gui,它可以將消息發送到本地連接上的活動服務器。實際上,這個設置將形成一個節點網絡。

是否有可能使服務器和客戶端在同一個應用程序中,最好不使用線程?我知道服務器會在偵聽連接時暫停,因此gui無法響應。

如果我不能在同一個應用程序中同時有兩個應用程序相互通信,但是線程看起來是一個更好的替代方案,因爲我將使用兩個過程。如果我有獨立的應用程序,我怎麼能從服務器發送字符串到客戶端,以更新gui?

當我想要服務器向客戶端發送消息時,會發生某種事件(在客戶端)嗎?

另外,如何檢查服務器是否處於活動狀態(可用並綁定到其計算機地址,等待消息)?

我的服務器/客戶端關係模型是否合理?有什麼建議麼?

我檢查了堆棧溢出類似的套接字問題,但沒有找到任何具體解決我的問題。我可能錯過了一些,所以請將我的注意力轉向他們,如果他們發現有關。

這個問題看起來非常相似:Python socket server: listening to multiple clients,但是他們似乎沒有每個客戶端的'服務器'&。

注:我是新來的套接字&聯網。

回答

0
  1. 首先,你需要閱讀一些關於套接字編程的好書或者一些文章(谷歌它 - 有很多)。 Stackoverflow是不夠的。你會浪費你的時間,試圖從隨機問題中學到一些東西 - 答案。
  2. 「服務器」並不意味着「僅接收模式」和「客戶端」並不意味着「僅發送模式。客戶端和服務器之間存在全雙工連接,不同之處在於」服務器「將打開端口並將等待傳入的連接,並且「客戶端」知道服務器地址將啓動該連接,一旦建立連接 - 「客戶端」和「服務器」將能夠進行全雙工通信
  3. 是的,有可能「服務器和客戶端在同一個應用程序中「,但這是非常罕見的行爲,如果你的服務器需要例如向其他服務器發送請求(例如google.com),你將需要它在服務器端。只需要處理兩種類型的插座:主動式和被動式。
  4. 「我怎麼能檢查一個服務器處於活動狀態?「。如果服務器處於「開」狀態,您將能夠連接到它。如果沒有 - 您的嘗試將返回一個錯誤(Python中的異常)。而已。
  5. 有兩種使用套接字的方法:阻塞模式和非阻塞模式。在後一種情況下,您的程序不需要等待操作結束。它可以在通過套接字接收或發送數據的同時開展業務。
  6. 我不建議你使用原始套接字。這不合理。只有當您嘗試創建一些具有一些獨特功能的全新套接字框架時才需要原始套接字(但爲了實現這一點,您應該成爲套接字開發方面的專家)。僅僅因爲在Python中已經有幾十個已經存在的框架(還有一些用於C/C++。libevent是其中最好的一個)。 Python異步套接字庫之一是asyncio - Python標準庫的一部分(適用於現代Python版本)。

祝你好運!

+0

我也使用了套接字,但是我不確定如何處理這兩個連接,並允許gui操作(發送)。 我打算有一個服務器和客戶端的應用程序,因爲如果我有一臺服務器,運行它的計算機可能會睡覺,離開等,所以一些客戶端將不得不承擔責任。你能否詳細說明或提供非阻塞模式的參考? (這是使用.select()?) – Ben

+0

我會看看asyncio,謝謝你的信息。 – Ben

+0

「這是使用.select()?」。是:select(),poll(),epoll()等。 – KromviellBlack

相關問題