2016-09-16 222 views
0

我试图在提示从键盘输入中输入文本后发送数据。该代码似乎工作,但没有出现提示。有人可以建议为什么吗?通过套接字发送和接收数据python3

代码发送的是:

#!/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中,这种行为已经发生了变化,这正是我所使用的。

回答

0

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

试试这个

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

你”其他选项是在accept之前运行输入提示,并将其存储在变量中。然后用这个变量调用respond - 这是一个片段

#!/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() 
相关问题