【问题标题】:send & receive data over a socket python3通过套接字 python3 发送和接收数据
【发布时间】:2016-09-17 00:33:31
【问题描述】:

在提示从键盘输入中输入文本后,我正在尝试发送数据。该代码似乎可以工作,但没有出现提示。任何人都可以提出原因吗?

要发送的代码是:

  #!/usr/bin/python3
  import socket
  class LogSocket:
    def __init__(self, socket):
      self.socket = socket

    def send(self, data):
      print( "Sending {0} to {1}".format(data, self.socket.getpeername()[0]) )
      self.socket.send(data)

    def close(self):
      self.socket.close()

  def respond(client):
    response = input("Enter a value: ")
    client.send(bytes(response, 'utf8'))
    client.close()

  if __name__ == "__main__":
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('localhost',2401))
    server.listen(1)
    try:
      while True:
        client, addr = server.accept()
        respond(LogSocket(client))
    finally:
      server.close()

要接收的代码是:

#!/usr/bin/python3
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 2401))
print("Received: {0}".format(client.recv(1024)))
client.close()

行为有点奇怪。当我在发送端输入“Hello World”再进入,切换到接收端运行接收脚本,没有任何输出。当我再次输入“Hello World”并在发送方中按回车键时,我重新运行接收脚本并出现“Hello World”,但会出现输入提示!

发送方输出:

Hello World
Enter a value: Sending b'' to 127.0.0.1
Hello World
Enter a value: Sending b'Hello World' to 127.0.0.1

接收器输出:

$ ./receive_data_socket1.py 
Received: b''
$ ./receive_data_socket1.py 
Received: b'Hello World'

有在 Python3 中处理套接字经验的人能解释一下这种行为吗?我知道行为在 3.5 中发生了变化,这就是我正在使用的。

【问题讨论】:

    标签: sockets python-3.x


    【解决方案1】:

    当您运行服务器时,它会在 server.accept() 调用中阻塞,直到客户端连接为止。即在客户端连接之前,它不会执行下一行代码。只有在下一行,respond(...) 函数,才会触发输入提示。

    试试这个

    1. 在一个选项卡中启动服务器
    2. 在另一个选项卡中启动客户端
    3. 返回服务器 - 您现在应该会看到提示

    您的另一个选择是在accept 之前运行输入提示,并将其存储在变量中。然后使用该变量调用 respond - 这是一个 sn-p

    #!/usr/bin/python3
    import socket
    class LogSocket:
        def __init__(self, socket):
            self.socket = socket
    
        def send(self, data):
            print( "Sending {0} to {1}".format(data, self.socket.getpeername()[0]) )
            self.socket.send(data)
    
        def close(self):
            self.socket.close()
    
    def respond(client, response):
        client.send(bytes(response, 'utf8'))
        client.close()
    
    if __name__ == "__main__":
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.bind(('localhost',2401))
        server.listen(1)
        try:
            while True:
                response = input("Enter a value: ")
                client, addr = server.accept()
                respond(LogSocket(client), response)
        finally:
            server.close()
    

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2012-06-09
      相关资源
      最近更新 更多