2016-09-16 4 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» и нажимаю enter в отправителе, я снова запускаю сценарий получения и появляется «Hello World», но с подсказкой от ввода!

выход Sender:

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() 
Смежные вопросы