手寫微信群聊伺服器

2022-08-05 07:00:16 字數 2782 閱讀 3507

1. 能夠連線多個客戶端;

2. 客戶端長時間未響應能夠斷開節省資源;

3. 能夠**,乙個使用者發來一條訊息,所有客戶端都可以接收;

直接使用socket.socket類就可以實現,但是這樣的話我們需要自己手動寫監聽,寫accept,把accept單獨放入乙個執行緒,每連入乙個執行緒就新開闢乙個執行緒。

這裡我們選用socketserver這個庫來實現,這樣我們只需要把核心步驟寫出來即可,其他的都能自動化幫我們完成了。

1

mport socketserver

2import

datetime

3import

threading45

6class myhandle(socketserver.baserequesthandler): #

每乙個執行緒就乙個例項

7def

self_server_init(self):8if

not hasattr(self.server, "

clients"):

9 setattr(self.server, "

clients

", {}) #

如果沒有這個屬性就給他增加乙個

10if

not hasattr(self.server, "

_lock_clients"):

11 setattr(self.server, "

lock_clients

", threading.lock())

12 self.server.__dict__["

hb_interval

"] = 10

13 self.server.clients[self.key] = datetime.datetime.now().timestamp() #

記錄時間

1415

defsetup(self):16#

self init

17 self.event =threading.event()

18 self.key =self.request, self.event19#

self.server init

20self.self_server_init()

2122

defhandle(self):

23 no_hb =set()

24while

notself.event.is_set():

25 data = self.request.recv(1024)

26print

(data.decode())

27if data == b"

^hb^

": #

收到了心跳包

28with self.server.lock_clients:

29 self.server.clients[self.key] =datetime.datetime.now().timestamp()

30if data == b""

or data.strip() == b"

quit":

31with self.server.lock_clients:

32 self.server.clients.pop(self.key, none) #

如果退出就彈出了

33break

#因為乙個執行緒是乙個連線

3435

#如果沒有退出我們就重新整理時間,也有可能是新的連線

36 self.server.clients[self.key] =datetime.datetime.now().timestamp()

3738

#傳送訊息的時候檢查是否超時了

39with self.server.lock_clients:

40for key, t in

self.server.clients.items():

41if datetime.datetime.now().timestamp() - t > self.server.hb_interval: #

如果超時了記錄一下這個key

42 no_hb.add(key) #

s和e都可雜湊

43continue

44 key[0].send("

from {}: {}

".format(self.client_address, data.decode()).encode())

45for key in

no_hb:

46 self.server.clients.pop(key) #

移除沒有心跳的客戶端

47no_hb.clear()

4849

deffinish(self):

50super().finish()

51self.event.set()

5253

54 server = socketserver.threadingtcpserver(("

127.0.0.1

", 9999), myhandle)

55 server.serve_forever() #

啟動

仿微信發起群聊

做安卓開發也有段時間了,一直看那些大神的部落格,一直在學習。這是第一次寫部落格,請多多指教。廢話不多說,上圖 寫這篇文章主要是記錄一下自己做專案時遇到的一些問題,當時寫這個功能的時候,也是在網上搜尋了不少關於這個功能的文字找資料,但是就沒有乙個符合我需求的。經過我自己的學習整合,總算把這個功能給搞定...

簡單的群聊伺服器程式設計

今天下午學習了群聊伺服器的程式設計,因為群聊伺服器需要同步執行,所以理所當然的運用到了多執行緒。把接受服務的客戶端封裝到乙個客戶端類裡面去,就可以實現群聊了。然後就是登陸操作 客戶端 伺服器 互動 就是伺服器的輸出send 和接收get 這裡再一次體現了類的封裝性,可以把send get 方法封裝到...

Python微信群聊打卡回覆

所需庫 import itchat import time我的itchat庫是用pycharm安裝了十幾次才裝上的,有的時候會裝不上,這個我知道,沒辦法,多裝幾次就好了,中間總會連線超時中斷。原理 當群內這幾個人都發過言,打過卡,程式就會給指定的群和人發訊息 import itchat import...