2012-08-30 4 views
0

Мне нужно написать приложение для контакта с сервером. После отправки нескольких сообщений он должен позволить пользователю взаимодействовать с сервером, отправив команду и получив результат.Как подключить сокет python к stdin/stdout

Как мне подключить текущий разъем, чтобы пользователь мог взаимодействовать с сервером без необходимости чтения ввода и записи вывода из/в stdin/stdout?

ответ

2

Вы имеете в виду использование netcat?

cat initial_command_file - | nc host:port 

ответ, что-то нужно читать и писать. В приведенном выше примере сценария оболочки cat читает из двух источников в последовательности и записывает в один канал; nc считывает с этого канала и записывает в сокет, но также считывает из сокета и записывает его в stdout.

Таким образом, будет всегда будет чтение и запись ... однако вы можете структурировать свой код, чтобы он не вторгался в логику связи.

Например, можно использовать itertools.chain создать входной итератор, который ведет себя аналогично cat, так что ваш TCP-облицовочный код может принимать один входной Iterable:

def netcat(input, output, remote): 
    """trivial example for 1:1 request-response protocol""" 
    for request in input: 
     remote.write(request) 
     response = remote.read() 
     output.write(response) 

handshake = ['connect', 'initial', 'handshake', 'stuff'] 
cat = itertools.chain(handshake, sys.stdin) 

server = ('localhost', 9000) 
netcat(cat, sys.stdout, socket.create_connection(server)) 
-1

Вы, вероятно, хотите что-то вроде pexpect. В основном вы должны создать объект spawn, который инициирует соединение (например, через ssh), затем используйте методы expect() и sendline() этого объекта для выдачи команд, которые вы хотите отправить в запросах. Затем вы можете использовать метод interact(), чтобы передать управление пользователю.

Смежные вопросы