gpt4 book ai didi

python-3.x - 如何通过套接字发送消息序列?

转载 作者:行者123 更新时间:2023-12-03 12:03:18 25 4
gpt4 key购买 nike

我正在尝试通过Python中的套接字进行通信。我有一个server.py文件和一个client.py。后者正在请求用户输入并将其发送到服务器。根据用户输入,服务器正在播放2种不同的声音。这一次只能工作一次,但不能第二次尝试。

我放入了一些print(XYZ)行,以查看程序在哪里停止。发送第一条消息后,不再执行我的server.py的“print(” ...“)”行。因此,看起来server_socket.accept()不再成功。这是为什么?

这是server.py:

import socket
import winsound

fnameBeep = "beep.wav"
fnameBop = "bop.wav"

server_socket = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
server_addr = ("127.0.0.1", 1337)
server_socket.bind(server_addr)
server_socket.listen(1000)
while True:
print("waiting...")
(client_socket, addr) = server_socket.accept()
print("...")
msg = client_socket.recv(1024)
print(msg)
print("Received: " + str(msg, "utf8"))
if str(msg, "utf8") == '1':
winsound.PlaySound(fnameBeep, winsound.SND_FILENAME)
else:
winsound.PlaySound(fnameBop, winsound.SND_FILENAME)

这是client.py:
import socket

client_socket = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
server_addr = ("127.0.0.1", 1337)
print("Beep = 1; Bop = 2")
client_socket.connect(server_addr)
while True:
print('waiting ...')
UserInput = input('Your choice: ')
print('Sending: ' + UserInput)
client_socket.send(bytes(UserInput, "utf8"))
print('Sent!')

怎么了?常规通信正在运行,但是我想向服务器发送一系列消息。

最佳答案

您要做的第一件事是将accept()调用移至while循环的顶部上方-实际上,您的代码正在尝试在每个命令之后接受新的TCP连接,我认为这不是您所需要的。想做的-大概是想保持单个TCP连接打开并通过该TCP连接接收多个命令。

第二个问题是成帧:关于TCP的要记住的事情是它实现了原始的字节流,并且没有自行对消息进行任何固定的成帧-例如如果您在发送方执行以下调用:

client_socket.send("123")
client_socket.send("456")
client_socket.send("789")

...在接收端,服务器可能会从其后续的recv()调用返回以下数据块:
recv() call #1:  12345
recv() call #2: 67
recv() call #3: 89

...或者,它可能(取决于网络的工作方式,月相等)得到以下信息:
recv() call #1:  1
recv() call #2: 2345678
recv() call #3: 9

否则它可能会在一个调用中获得所有已发送的数据:
recv() call #1:  123456789

或者它甚至可以通过单独的调用接收每个字节:
recv() call #1:  1
recv() call #2: 2
recv() call #3: 3
recv() call #4: 4
recv() call #5: 5
recv() call #6: 6
recv() call #7: 7
recv() call #8: 8
recv() call #9: 9

...或您可以想象的任何其他组合。

因此,问题是,鉴于数据分块的不确定性,接收者如何才能知道您的客户端打算发送(“file_name1.wav”,然后是“file_name2.wav”)而不是仅仅发送(“file_name1.wavfile_name.wav”) )或("file",“name1.wavfile”,“name.wav”)等?

为了明确地解析输入的TCP字节,接收器必须知道如何对其进行帧化。对于像您这样的简单程序,框架逻辑可能很简单-例如只需声明一个规则,即每个字符串的末尾都应包含换行符。然后,您的服务器可以简单地继续接收字节(并将它们添加到字符串的末尾),直到看到换行字节为止,此时知道已接收到完整的用户命令,因此可以处理该命令,然后删除所有字符串(直到并包括换行符),然后继续解析下一个字符串。

另一种方法是让发送方在每个命令之前包含一个短(固定长度) header ,以指示接收方应该在下一个命令中看到的字节数。然后服务器可以读取 header (因为 header 是固定长度的,因此服务器将知道要读取完整的 header 之前需要读取多少个字节),然后读取多个字节,然后处理命令,然后重复。

关于python-3.x - 如何通过套接字发送消息序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54487463/

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