Python - показать путь, простая проблема с сокетом - PullRequest
0 голосов
/ 11 декабря 2018

Я недавно отправился в python в 3.7. Я хочу создать сервер / клиент, чей клиент будет показывать путь, который я указал при вводе (macOS):

Сервер

import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 1337              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        info = conn.recv(1024)
        print(info)
        raw_input("Push to exit")
        s.close()

Клиент:

import socket
import os

HOST = ''    # The remote host
PORT = 1337              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    print('Connected')
    info = os.listdir("/Users/jhon")
    s.send(str(info))
    s.close()
  1. Запуск сервера и его прослушивание ...

  2. python client.py Подключенная трассировка (последний последний вызов): Файл "client.py ", строка 10, в s.send (str (info)) TypeError: требуется байтоподобный объект, а не 'str' (не понимаю этого), и после запуска клиента впоказ сервера:

  3. Соединено с ('127.0.0.1', 52155) b '' Traceback (последний вызов был последним): файл "server.py", строка 13, в raw_input ("нажмите дляexit ") NameError: имя 'raw_input' не определено (venv) MBP-di-Jhon: без названия1 jhon $

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете изменить код клиента на:

HOST = ''    # The remote host
PORT = 1337              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    print('Connected')
    info  = "\n".join(os.listdir("/Users/jhon"))
    s.send(info.encode())
    s.send(info)
    s.close()

os.listdir("/Users/jhon") возвращает list, мы используем join и encode длясделать это byte объект, который необходим для s.send()

0 голосов
/ 11 декабря 2018

Вы рисковали в 3.7 из версии 2.x без изменения кода 2.x.Прочитайте что-нибудь о различиях, прежде чем продолжить.Чтобы помочь вам начать:

Замените raw_input на input.(Можно заменить 2.x input() на eval(input()), но почти всегда следует использовать более конкретный оценщик, такой как int(input()).)

В 3.x строки - это юникод, тогда как сокетывсе еще требуют байты.Измените send и recv на

s.send(str(info).encode())
info = conn.recv(1024).decode()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...