【发布时间】:2020-12-17 17:44:19
【问题描述】:
我正在尝试将我必须的功能性 UDP 套接字转换为 TCP,但我遇到了困难,因为我找不到为什么我无法获得输入以在 TCP 上工作的解释。 UDP 中的相同代码可以工作。在 TCP 中,我只是得到一个“空白”输入。
客户端
elif cmd[0] == 'INSERT':
name = input("\nNAME: ")
artist = input("ARTIST: ")
album = input("ALBUM NAME: ")
year = input("YEAR: ")
newsong = name + ";" + artist + ";" + album + ";" + year + "\n"
sock.sendto(bytes(newsong, "UTF-8"), serv)
服务器端
elif cmd[0].upper() == 'INSERT':
with open("songs.txt", "a", encoding='UTF-8') as fd:
receive_message = con.recvfrom(TAM_MSG)
msg = receive_message[0]
fd.write(str(msg, "UTF-8"))
fd.close()
这完全适用于 UDP,但不适用于 TCP。有什么方法可以输入到 TCP 服务器吗?如何? 谢谢。
【问题讨论】:
-
TCP 服务器需要
bind()和listen()。 UDP 服务器只需要bind()。请参阅 wiki.python.org/moin/TcpCommunication 和 wiki.python.org/moin/UdpCommunication。 UDP 服务器只监听来自任何来源的任何消息,而 TCP 服务器实际上需要创建双向流。 -
我同意弗兰克的观点,你能发布更多关于如何创建套接字两端的完整代码吗?
-
感谢您的回答。我阅读了有关流媒体的信息并找到了答案。我认为问题出在客户端,但既然你说这是我在服务器上尝试的两个流。只需在服务器端的
with open之前添加行con.send(str.encode(f"Inserting new song: "))就可以了!谢谢你们! -
工作量远不止这些。 TCP 不像 UDP 那样基于消息,因此您需要一个协议来读取 TCP 字节流并将其分解为有效消息。把 TCP 流想象成一个文件。您需要一些协议来知道行的结束位置(查找换行符)或二进制结构的开始和结束位置(提供长度)。