【问题标题】:Python continuous TCP connectionPython连续TCP连接
【发布时间】:2017-08-05 04:37:41
【问题描述】:

我是套接字编程的新手,正在尝试重新使用 python。我想写一个简单的 TCP 程序,它会持续保持连接直到达到某个结束状态,在这种情况下,“关闭”是由客户端发送的。

这在第一次迭代中运行良好,但是在我发送的第二个东西上它冻结了,我不知道为什么。有人可以解释为什么我的程序冻结或如何更好地实现这一点?

TCPServer.py

from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serverSocket.bind(('', serverPort))
serverSocket.listen(1)
print('The server is ready to recieve')

while True:
    connectionSocket, addr = serverSocket.accept()
    sentence = connectionSocket.recv(1024).decode()
    if(sentence == "close"):
        connectionSocket.close()
    capSentence = sentence.upper()
    connectionSocket.send(capSentence.encode())

TCPClient.py

from socket import *
serverName = 'localhost'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
while(1):
    sentence = raw_input('input sentence: ')
    if(sentence == "close"):
        break
    clientSocket.send(sentence.encode())
    retSentence = clientSocket.recv(1024)
    print('From server; ', retSentence.decode())

clientSocket.close()

【问题讨论】:

    标签: python sockets tcp connection


    【解决方案1】:

    您在客户端中只有一个套接字连接,但在服务器代码中,您在 while 循环中有 accept 调用。将其移出循环。

    虽然代码有很多问题,但这有点取决于你想从这里去哪里

    【讨论】:

      【解决方案2】:

      服务器存在多个问题。我会尽量指出我所看到的。

      如果接收到的数据不等于"close",服务器不会再次尝试从客户端套接字读取第二次发送的内容。您需要另一个循环来完成此操作,例如:

      while True:
          connectionSocket, addr = serverSocket.accept()
      
          while True:
              sentence = connectionSocket.recv(1024).decode()
              if sentence == "close": break
              capSentence = sentence.upper()
              connectionSocket.send(capSentence.encode())
      
          connectionSocket.close()
      

      另外,请注意,服务器同步运行循环,因此在第一个连接关闭之前它无法接受第二个连接。

      最后,您缺少错误处理代码。如果客户端过早断开连接,整个服务器将崩溃。


      如果您的目标是让服务器只处理 单个 连接然后终止,最简单的解决方案是将 accept() 调用移到主循环之外(否则您等待 新的连接每次迭代)。

      connectionSocket, addr = serverSocket.accept()
      
      # Destroy the server socket; we don't need it anymore since we are not
      # accepting any connections beyond this point.
      serverSocket.close()
      
      while True:
          sentence = connectionSocket.recv(1024).decode()
          if(sentence == "close"):
              connectionSocket.close()
              break
          capSentence = sentence.upper()
          connectionSocket.send(capSentence.encode())
      

      【讨论】:

      • 我对连接循环进行了更改,这似乎解决了我在这种特定情况下遇到的一些问题,但如果我愿意,我是否需要改变我的处理方式多个客户端异步连接服务器?
      • @user2860682 是的,如果您想同时处理多个连接,您应该使用事件循环。类似扭曲或异步的东西。
      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 2017-11-10
      • 2013-09-04
      • 2019-02-25
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多