這是用于我的應用程式的服務器身份驗證。(我正在研究登錄功能,所以不要介意)我想做的是讓服務器從客戶端接收心跳并關閉客戶端套接字,如果它在幾分鐘內沒有回應我也想檢測每個用戶的連接數。
對于接收心跳,我可以讓客戶端不斷發送心跳但是你如何讓服務器檢測它?我知道需要時間測量,但如果我將 time.perf_counter() 放在'client_socket.recv(1024)' 之前,計數器函式將不會被執行,因為它正在等待接收。那么我將如何解決這個問題?
我還試圖讓它檢測每個用戶的連接數。(每個用戶最多 5 個連接)用于檢測,當用戶連接時我給用戶名 1,當用戶斷開連接時給 -1,但我不確定我做的方法是否正確或這樣做的好方法。
如果你能幫助我,我將不勝感激
------------------------server----------------------------
import socket
from _thread import *
import sys
import time
username = ['test123', 'hongengi']
userconnect= 0
def threaded(client_socket, addr):
print('Connected by :', addr[0], ':', addr[1])
while True:
try:
data = client_socket.recv(1024)
print (data.decode())
print('Received from ' addr[0],':',addr[1] , data.decode())
if data.decode() == ".": # heartbeat
heartbeat = time.perf_counter()
print ("heartbeat")
if data.decode() == "test123":
print ("login success")
userconnect == userconnect 1
if not data:
print ("no data / disconnect ")
print('Disconnected by ' addr[0],':',addr[1])
userconnect == userconnect - 1
break
client_socket.send(data)
except (ConnectionResetError, socket.error) as e:
print ("error occurs")
print('Disconnected by ' addr[0],':',addr[1])
userconnect == userconnect - 1
break
client_socket.close()
HOST = '127.0.0.1'
PORT = 5000
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen()
print('server start')
while True:
print('wait')
client_socket, addr = server_socket.accept()
start_new_thread(threaded, (client_socket, addr))
server_socket.close()
------------------------client----------------------------
import socket
SERVER_IP = 'localhost'
SERVER_PORT = 5000
SIZE = 100
SERVER_ADDR = (SERVER_IP, SERVER_PORT)
heartbeat = "."
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(SERVER_ADDR)
#username = "test123"
#userpass = "123123"
while True:
client_socket.send(heartbeat.encode())
msg = client_socket.recv(SIZE)
print (msg.decode())
uj5u.com熱心網友回復:
當另一個套接字關閉時,套接字的一端永遠不會“通知”。沒有直接的聯系,所以唯一的方法就是超時。您可以使用socket.timeout來建立超時時間。然后您recv將回傳 0 個位元組,這表明您的超時已過期。
如何在 python 的 socket recv 方法上設定超時?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/512340.html
