作为我问题的背景,我是一名计算机专业的学生,第一次开始使用Python。在此之前,我主要使用Java,现在我对Java约定和实践非常熟悉。
背景
socket编程的一个赋值要求我们在机器的本地服务器和客户机之间发送字符串。我们提供了示例(Python 2)代码,用于实例化服务器和客户机。在赋值的上下文之外,我想创建一个同样在Python 3中运行的代码版本,但是我在让客户端在python3中同样工作时遇到了问题。
更改服务器和客户端
最初,服务器只需要稍作改动,我就可以让它正常工作了。我的服务器代码如下:#!/usr/bin/python3
import socket
HOST=''
PORT=5870
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(1)
conn, addr = sock.accept()
print('Connected by ', addr)
conn.sendto("Welcome to the server!", (HOST, PORT))
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
我无法将客户端转换为在Python 3中运行和运行的代码。我试着深入研究这个问题,但其他在线资源对我没有帮助(至少在我的经验水平上)。我的服务器代码如下。#!/usr/bin/python3
import socket
HOST='127.0.0.1'
PORT=5870
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
data = sock.recv(1024)
print('Server sent', data)
sock.sendto("Hello world".encode(), (HOST, PORT))
data = sock.recv(1024)
print("Server sent", data)
sock.sendto("This is the second message".encode(), (HOST, PORT))
data = sock.recv(1024)
print('Server sent ', data)
sock.close()
实际问题
最初,服务器和客户机的这段代码都使用sendall()而不是sendto(),但我在客户机中获得TypeError并读取this question后更改了它。我仍然不清楚为什么这样做或为什么我必须这样做(尽管我希望有一个解释)。
现在,当我运行客户机代码时,即使在使用sendto()时,我也会在服务器上获得相同的TypeError,但我不确定如何在Python 3中解决此问题。我收到的服务器stacktrace如下所示(我在客户端收到一个断管):$ python3 mail_server.py
Connected by ('127.0.0.1', 41866)
Traceback (most recent call last):
File "mail_server.py", line 14, in
conn.sendto("Welcome to the server!", (HOST, PORT))
TypeError: a bytes-like object is required, not 'str'
我做错了什么?我如何才能在Python3中使用它?背景背景关于为什么这是特别有帮助的,因为我认为我的问题的一部分是,我不明白为什么这个变化是必要的开始。谢谢!