gpt4 book ai didi

Python 3 套接字编程 : using sendall vs. sendto

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:51 27 4
gpt4 key购买 nike

关于我的问题,我是一名计算机专业的学生,​​第一次开始使用 Python。在此之前,我主要从事 Java 工作,现在我最熟悉 Java 约定和实践。

背景

套接字编程的作业要求我们在机器本地的服务器和客户端之间发送字符串。我们提供了实例化服务器和客户端的示例 (Python 2) 代码。在作业上下文之外,我想创建此代码的一个版本,它也可以在 Python 3 中运行,但我在让客户端在 Python 3 中运行时遇到了问题。

更改服务器和客户端

最初,服务器只需要很少的改动,我就能让它正常工作。我的服务器代码如下:

#!/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 .我仍然不确定为什么这样做有效或为什么我必须这样做(尽管我希望得到解释)。

现在,当我运行客户端代码时,我将得到相同的 TypeError在服务器上,即使我正在使用 sendto() ,但我不确定如何在 Python 3 中解决此问题。我收到的服务器堆栈跟踪信息如下(客户端的管道损坏):

$ python3 mail_server.py 
Connected by ('127.0.0.1', 41866)
Traceback (most recent call last):
File "mail_server.py", line 14, in <module>
conn.sendto("Welcome to the server!", (HOST, PORT))
TypeError: a bytes-like object is required, not 'str'

我做错了什么,我如何才能让它在 Python 3 中正常工作?关于为什么这样做的背景上下文会特别有帮助,因为我认为我的部分问题是我不明白为什么一开始就需要进行此更改。谢谢!

最佳答案

不要在流套接字上使用sendto()。一旦连接了套接字(对于流式套接字,在连接之前你不能进行任何数据传输),你不能指定目的地,它总是被发送到它所连接的远程地址/端口。

所以使用send()sendall():

socket.sendall("Hello world".encode());

关于Python 3 套接字编程 : using sendall vs. sendto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40139775/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com