Python-显示路径,简单的套接字问题

时间:2018-12-10 21:57:06

标签: python sockets

我最近在3.7中冒险使用python 我想制作一个服务器/客户端,其客户端将显示我输入的路径(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 Connected Traceback(最近一次通话):文件 第10行中的“ client.py”     s.send(str(info)) TypeError:需要一个类似字节的对象,而不是'str'(不理解),并且在客户端启动后,在服务器中显示:

    < / li>
  3. 通过('127.0.0.1',52155)连接b''追溯(最近通话) 最后):文件“ server.py”,第13行,在     raw_input(“ press for exit”)NameError:未定义名称'raw_input'(venv)MBP-di-Jhon:untitled1 jhon $

2 个答案:

答案 0 :(得分:0)

您从某些2.x版本冒险进入3.7,而无需修改2.x代码。在继续之前,请先阅读有关差异的内容。为了帮助您入门:

raw_input替换为input。 (一个人可以用input()替换2.x eval(input()),但是几乎应该总是使用更具体的评估器,例如int(input())。)

在3.x中,字符串是unicode,而套接字仍然需要字节。将发送和接收更改为

s.send(str(info).encode())
info = conn.recv(1024).decode()

答案 1 :(得分:0)

您可能希望将客户端代码更改为:

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,我们使用joinencode使其成为byte的对象s.send()