【问题标题】:Python Client wont reconnect to ServerPython 客户端无法连接到服务器
【发布时间】:2019-01-17 19:39:39
【问题描述】:

自过去 3 天以来,我一直在尝试修复此错误,但我慢慢厌倦了它,请有人指出我正确的方向吗?

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

服务器.py

​​>
#!/usr/python

import socket
import os

port = 3000

def clear():
    os.system('clear')
    print("-:-:-:-:-:Server:-:-:-:-:-")

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

clear()

clientsocket, addr = serversocket.accept()
print("Connection from: " + str(addr))
while True:
    msg = raw_input(" ->")

    if msg == "help":
        clear()
        print("+-----------------------------------+")
        print("|             Help Menu             |")
        print("+-----------------------------------+")      
        print("|   help       -   shows help menu  |")
        print("+-----------------------------------+")
        print("|   clear      -   clears           |")
        print("+-----------------------------------+")
        raw_input("Press ANY key to return")
        clear()
    elif msg == "clear":
        clear()
    else:
        msg = str(msg).encode("UTF-8")
        clientsocket.send(msg)
        msg = clientsocket.recv(4096)
        print(msg.decode("UTF-8"))

和

客户端.py

​​>
#!/usr/python

import socket
import time

def send(msg):
    try:
        s.send(msg.encode("UTF-8"))
    except:
        Connect()

def getInstructions():
    try:
        while True:
            msg = s.recv(4096)
            inst = msg.decode("UTF-8")
            time.sleep(5)
            send("!")
    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))
        getInstructions()
    except:
        time.sleep(1)
        print("Connect() Exception")
        Connect()
Connect()

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

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

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

客户端每 5 秒发送一个字符串(在这种情况下为“!”),如果服务器没有收到它,客户端正在尝试重新连接到服务器,这是问题所在,客户端没有重新连接,它卡在了Connect() 循环,因为它不能再重新连接了

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

客户端.py

​​>
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()

    def Connect():
        try:
            print("Connect() connecting to: "+ str(host) + str(3000))
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((host, 3000))
            getInstructions()
        except:
            time.sleep(1)
            print("Connect() Exception")
            Connect()

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

还有一些好话,然后客户端连接到服务器,然后我停止服务器,客户端进入“重新连接模式”,然后我再次启动服务器,没有任何反应,客户端是仍在尝试重新连接(但失败)。现在我必须重新启动客户端才能重新连接,这并不是我真正想要的..

【问题讨论】:

    标签: python sockets server client


    【解决方案1】:

    我终于..终于!找到了这个不起作用的原因.. (我不是专家,所以也许有人可以将其更改为更“准确”)

    我创建了一个 TCP 套接字连接,它可能将其连接详细信息完全保存在变量 s 中

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    

    关于连接详细信息,我的意思可能是它自己的,例如服务器具有不会改变太多的静态详细信息(端口 3000 上的 192.168.2.100),但客户端不使用该特定端口进行通信,客户端需要一些可用的随机端口,出于某种原因,这就是客户端无法工作的原因 (但那只是我的论文,我不知道更好..)

    但这就是我改变的地方

    客户端.py

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

    但这就是我如此热爱编程的原因,它当然是一把 2 片刀,但该死的,这感觉就像你在 10 秒内解决了一个愚蠢的错误后得到的。值得打字

    【讨论】:

      【解决方案2】:

      服务器需要接收命令。

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

      和客户。

      Client.py

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

      【讨论】:

      • 感谢您的回复,但是,它仍然无法像我希望的那样工作,例如 1. 启动 Server.py 2. 启动 Client.py 3. ^C Server.py 4. 启动 Server.py然后什么也没发生,我的意思是客户端应该能够再次重新连接,但由于某种原因没有发生
      • 好的,我想我找到了问题,客户端使用的是同一个套接字,可能是这个原因吗?
      猜你喜欢
      • 2022-01-21
      • 2012-10-15
      • 2020-06-17
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多