Python客户端无法重新连接到服务器
在过去的三天里,我一直在试图修复这个错误,我慢慢厌倦了,有人能给我指出正确的方向吗 所以,我写了两个脚本,一个是服务器,另一个是客户端 Server.py 及 Client.py 简而言之,我的程序所做的是 服务器启动并等待传入流量 客户端启动并向服务器发送流量 客户端每5秒钟发送一个字符串(在本例中为“!”),如果服务器无法接收到该字符串,则客户端正在尝试重新连接到服务器,问题是,客户端没有重新连接,它被卡在Connect()循环中,因为它无法再重新连接 我试图在重新连接时始终创建一个新套接字 Client.py 这似乎以某种方式解决了问题,客户端能够重新连接到服务器,但这一行确实更破坏了代码,客户端显示为已被服务器连接,但客户端没有收到任何已发送的数据Python客户端无法重新连接到服务器,python,sockets,server,client,Python,Sockets,Server,Client,在过去的三天里,我一直在试图修复这个错误,我慢慢厌倦了,有人能给我指出正确的方向吗 所以,我写了两个脚本,一个是服务器,另一个是客户端 Server.py 及 Client.py 简而言之,我的程序所做的是 服务器启动并等待传入流量 客户端启动并向服务器发送流量 客户端每5秒钟发送一个字符串(在本例中为“!”),如果服务器无法接收到该字符串,则客户端正在尝试重新连接到服务器,问题是,客户端没有重新连接,它被卡在Connect()循环中,因为它无法再重新连接 我试图在重新连接时始终创建一个新套接字
还有一些可能是好的说法,然后客户端连接到服务器,然后我停止服务器客户端进入“重新连接模式”,然后我再次启动服务器,什么都没有发生,客户端仍在尝试重新连接(但失败)。现在我必须重新启动客户端才能重新连接,而这并不是我真正想要的。服务器需要接收命令 Server.py
import socket
import os
port = 3000
#Starting Server
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host = socket.gethostname()
serversocket.bind((host, port))
serversocket.listen(1)
clientsocket, addr = serversocket.accept()
print("Connection from: " + str(addr))
clientsocket.send("-:-:-:-:-: Connected in theServer :-:-:-:-:-")
def menuHelp():
clientsocket.send("\
+-----------------------------------+ \n \
| Help Menu | \n \
+-----------------------------------+ \n \
| help - shows help menu | \n \
+-----------------------------------+ \n \
| clear - clears | \n \
+-----------------------------------+")
while True:
msg = clientsocket.recv(4096)
msg = msg.decode("UTF-8")
if msg == "help":
menuHelp()
elif msg == "clear":
clientsocket.send("Command Clear\n")
else:
clientsocket.send("invalid option\n")
menuHelp()
import socket
import time
def send(msg):
try:
s.send(msg.encode("UTF-8"))
except:
Connect()
def getInstructions():
try:
msg = s.recv(4096)
print(msg.decode("UTF-8"))
input("Press ANY key to return")
except:
Connect()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
def Connect():
try:
print("Connect() connecting to: "+ str(host) + str(3000))
s.connect((host, 3000))
send("help")
while True:
getInstructions()
cli = input(" ->")
send(cli)
except:
time.sleep(1)
print("Connect() Exception")
Connect()
Connect()
还有客户
Client.py
import socket
import os
port = 3000
#Starting Server
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
host = socket.gethostname()
serversocket.bind((host, port))
serversocket.listen(1)
clientsocket, addr = serversocket.accept()
print("Connection from: " + str(addr))
clientsocket.send("-:-:-:-:-: Connected in theServer :-:-:-:-:-")
def menuHelp():
clientsocket.send("\
+-----------------------------------+ \n \
| Help Menu | \n \
+-----------------------------------+ \n \
| help - shows help menu | \n \
+-----------------------------------+ \n \
| clear - clears | \n \
+-----------------------------------+")
while True:
msg = clientsocket.recv(4096)
msg = msg.decode("UTF-8")
if msg == "help":
menuHelp()
elif msg == "clear":
clientsocket.send("Command Clear\n")
else:
clientsocket.send("invalid option\n")
menuHelp()
import socket
import time
def send(msg):
try:
s.send(msg.encode("UTF-8"))
except:
Connect()
def getInstructions():
try:
msg = s.recv(4096)
print(msg.decode("UTF-8"))
input("Press ANY key to return")
except:
Connect()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
def Connect():
try:
print("Connect() connecting to: "+ str(host) + str(3000))
s.connect((host, 3000))
send("help")
while True:
getInstructions()
cli = input(" ->")
send(cli)
except:
time.sleep(1)
print("Connect() Exception")
Connect()
Connect()
我终于。。最后找到了这不起作用的原因。。 (我不是专家,所以也许有人可以在下面把它改得更“准确”) 我创建了一个TCP套接字连接,该连接可能完全保存在变量s中
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
关于连接详细信息,我指的是它自己的,例如,服务器的静态详细信息不会有太大变化(端口3000上的192.168.2.100),但客户端不使用特定端口进行通信,客户端使用一些可用的随机端口,出于某种原因,这就是客户端无法工作的原因
(但这只是我的论文,我不太清楚。)
但这就是我所改变的
Client.py
但这就是为什么我如此热爱编程,它当然是一把2刀,但该死的,在用10秒解决了一个愚蠢的错误后,你们会有这种感觉。值得键入的内容谢谢您的回复,但是,它仍然没有像我希望的那样工作,例如1。启动Server.py 2。启动Client.py 3^C Server.py4。再次启动Server.py,然后什么都没有发生,我的意思是客户端应该能够再次重新连接,但由于某些原因没有重新连接好吧,我想我发现了问题,客户端使用的是同一个套接字,这可能是原因吗?
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Connection
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
def Reconnect(): #Ive created a new function called Reconnect, because, .., well it works fine for now
try:
global s #Its accessing the global socket variable
s = "" #blanks it out (not sure if i have to blank it out)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # create again a new socket
s.connect((host, port)) # It tries to connect again
getInstructions() # done~
except:
time.sleep(1)
print("Reconnecting")
Reconnect()
def Connect():
try:
print("Connect() connecting to: "+ str(host) + str(port))
s.connect((host, port))
getInstructions()
except:
time.sleep(1)
print("Connect() Exception, trying to Reconnect()")
Reconnect()