Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python客户端无法重新连接到服务器_Python_Sockets_Server_Client - Fatal编程技术网

Python客户端无法重新连接到服务器

Python客户端无法重新连接到服务器,python,sockets,server,client,Python,Sockets,Server,Client,在过去的三天里,我一直在试图修复这个错误,我慢慢厌倦了,有人能给我指出正确的方向吗 所以,我写了两个脚本,一个是服务器,另一个是客户端 Server.py 及 Client.py 简而言之,我的程序所做的是 服务器启动并等待传入流量 客户端启动并向服务器发送流量 客户端每5秒钟发送一个字符串(在本例中为“!”),如果服务器无法接收到该字符串,则客户端正在尝试重新连接到服务器,问题是,客户端没有重新连接,它被卡在Connect()循环中,因为它无法再重新连接 我试图在重新连接时始终创建一个新套接字

在过去的三天里,我一直在试图修复这个错误,我慢慢厌倦了,有人能给我指出正确的方向吗

所以,我写了两个脚本,一个是服务器,另一个是客户端

Server.py 及

Client.py 简而言之,我的程序所做的是

服务器启动并等待传入流量

客户端启动并向服务器发送流量

客户端每5秒钟发送一个字符串(在本例中为“!”),如果服务器无法接收到该字符串,则客户端正在尝试重新连接到服务器,问题是,客户端没有重新连接,它被卡在Connect()循环中,因为它无法再重新连接

我试图在重新连接时始终创建一个新套接字

Client.py 这似乎以某种方式解决了问题,客户端能够重新连接到服务器,但这一行确实更破坏了代码,客户端显示为已被服务器连接,但客户端没有收到任何已发送的数据


还有一些可能是好的说法,然后客户端连接到服务器,然后我停止服务器客户端进入“重新连接模式”,然后我再次启动服务器,什么都没有发生,客户端仍在尝试重新连接(但失败)。现在我必须重新启动客户端才能重新连接,而这并不是我真正想要的。

服务器需要接收命令

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()