1. 能夠連線多個客戶端;
2. 客戶端長時間未響應能夠斷開節省資源;
3. 能夠**,乙個使用者發來一條訊息,所有客戶端都可以接收;
直接使用socket.socket類就可以實現,但是這樣的話我們需要自己手動寫監聽,寫accept,把accept單獨放入乙個執行緒,每連入乙個執行緒就新開闢乙個執行緒。
這裡我們選用socketserver這個庫來實現,這樣我們只需要把核心步驟寫出來即可,其他的都能自動化幫我們完成了。
1mport 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...