我最近在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()
服务器正在启动,正在监听...
python client.py Connected Traceback(最近一次通话):文件 第10行中的“ client.py” s.send(str(info)) TypeError:需要一个类似字节的对象,而不是'str'(不理解),并且在客户端启动后,在服务器中显示:
< / li>答案 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
,我们使用join
和encode
使其成为byte
的对象s.send()
>