pythonsocket-Can';I don’我再也不接了
我已经设置了一个带有客户端和主机的套接字服务器。 在客户端断开连接之前,它可以正常工作,包括.shutdown()和.close()。 当我再次启动客户端时,它无法连接。 我想这不是因为我是如何编写代码的,而是因为我没有编写什么 如何使服务器真正断开客户端的连接,以便它可以再次连接 服务器:pythonsocket-Can';I don’我再也不接了,python,sockets,reconnect,Python,Sockets,Reconnect,我已经设置了一个带有客户端和主机的套接字服务器。 在客户端断开连接之前,它可以正常工作,包括.shutdown()和.close()。 当我再次启动客户端时,它无法连接。 我想这不是因为我是如何编写代码的,而是因为我没有编写什么 如何使服务器真正断开客户端的连接,以便它可以再次连接 服务器: import socket, threading, time, json ONLINE_USERS = [] SESSION = None class User(): def __init__(
import socket, threading, time, json
ONLINE_USERS = []
SESSION = None
class User():
def __init__(user, connection, address):
print('for', address, '{Connection established}')
user.connection = connection
user.address = address
user.character = None
threading.Thread(target=user.process, args=(), daemon=True).start()
def process(user):
time.sleep(1)
user.send("&pLogin\n^^^^^\n")
username = user.send("&iUser>")
password = user.send("&iPass>")
print(user.ping())
print(user.logout())
def send(user, *x):
user.connection.sendall(str.encode(str(x)))
data = user.connection.recv(1024)
return data if data!=b'\x01' else True
def recv(user, x):
user.connection.recv(x)
def ping(user):
start = time.time()
user.connection.sendall(b'\x02')
end = float(user.connection.recv(1024))
return round((end - start) * 1000)
def logout(user):
user.connection.sendall(b'\x04')
return user.connection.recv(4)
class Session():
def __init__(session, host='', port=12345):
session.host = host
session.port = port
session.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
session.socket.bind((host, port))
session.socket.listen(10)
def accept():
conn = User(*session.socket.accept())
session.thread_accept = threading.Thread(target=accept, args=(), daemon=True).start()
def shutdown():
for user in ONLINE_USERS.keys():
ONLINE_USERS[user].connection.sendall(bytes([0xF]))
if __name__ == '__main__':
SESSION = Session()
input('Press heart to continue!\n')
客户:
import socket, sys, threading, time, os
def clear(t=0.5):
time.sleep(t)
os.system('cls')
def tryeval(x, default):
try:
return eval(x)
except:
return default
class Client():
def __init__(client):
try:
server_info = input('IP_ADDRESS:PORT>').split(':')
client.host = server_info[0]
client.port = int(server_info[1])
except:
client.host = 'localhost'
client.port = 12345
client.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.socket.settimeout(10)
try:
client.socket.connect((client.host, client.port))
clear()
client.data_exchange()
finally:
client.shutdown()
def data_exchange(client):
while True:
data = client.socket.recv(1024)
if data:
if data==b'\x02':
client.socket.sendall(str.encode(str(time.time())))
elif data==b'\x04':
client.shutdown()
else:
data = tryeval(data, ())
response = []
for item in data:
try:
prefix, content = item[:2], item[2:]
if prefix=='&p':
print(content, end='')
elif prefix=='&i':
response.append(input(content))
if prefix=='&c':
time.sleep(float(content))
clear()
except:
pass
if len(response)>0:
client.socket.sendall(str.encode(str(tuple(response))))
else:
client.socket.sendall(b'\x01')
time.sleep(0.001)
def shutdown(client):
try:
client.socket.sendall(b'\x04')
except:
pass
print('Shutting down program.')
client.socket.shutdown(socket.SHUT_RDWR)
print('Socket has been shutdown.')
client.socket.close()
print('Socket has been closed.')
print('Exiting program')
time.sleep(1)
sys.exit()
if __name__ == '__main__':
client = Client()
“服务器反复调用accept,等待新的传入连接。”不,不会。它在一个线程中调用
accept
一次,该线程退出Mark Tolonen您是否收到错误消息?始终有问题显示完整错误消息(回溯)您的服务器呼叫接受多少次?我没有收到任何错误消息。如果要运行服务器和客户机,它可以工作。然后关闭客户端并再次打开它,它永远不会连接,什么也不会发生。服务器重复调用accept,等待新的传入连接。在会话下,您有以下内容:def accept():conn=User(*Session.socket.accept())Session.thread\u accept=threading.thread(target=accept,args=(),daemon=True)。start()
“服务器重复调用accept,等待新的传入连接。”不,它不会。它在一个线程中调用accept
一次,然后退出。哎哟。。。我怎么会错过呢?x) 谢谢你指出这一点。现在可以了。有点尴尬。既然这只是我的疏忽,我是否应该删除这篇文章,这样其他人就不会来这里寻找答案,而事实上这与我无关?