【问题标题】:How to ask for input in a TCP socket in Python?如何在 Python 的 TCP 套接字中请求输入?
【发布时间】: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/TcpCommunicationwiki.python.org/moin/UdpCommunication。 UDP 服务器只监听来自任何来源的任何消息,而 TCP 服务器实际上需要创建双向流。
  • 我同意弗兰克的观点,你能发布更多关于如何创建套接字两端的完整代码吗?
  • 感谢您的回答。我阅读了有关流媒体的信息并找到了答案。我认为问题出在客户端,但既然你说这是我在服务器上尝试的两个流。只需在服务器端的 with open 之前添加行 con.send(str.encode(f"Inserting new song: ")) 就可以了!谢谢你们!
  • 工作量远不止这些。 TCP 不像 UDP 那样基于消息,因此您需要一个协议来读取 TCP 字节流并将其分解为有效消息。把 TCP 流想象成一个文件。您需要一些协议来知道行的结束位置(查找换行符)或二进制结构的开始和结束位置(提供长度)。

标签: python sockets


【解决方案1】:

嗯,我读到了 TCP,它需要有一个双向流,正如那些人在评论中指出的那样。

server.py 的开头只添加一行就可以了。

con.send(str.encode(f"Inserting a new song: "))

谢谢大家!

P.S:这当然不是最好的答案,因为我是新手。我猜我很幸运,所以这对我有用

【讨论】:

  • 它一直有效,直到它坏了。 send(b'message1'); send(b'message2')data = recv(1024) 可以收到 b'message1mess'。 TCP 仅保证字节将以相同的顺序接收,但不保证相同的中断。 recv(x) 将从流中返回零(套接字关闭)或 1 到 x 个字节。缓冲数据并在数据中提供长度或标记值以查找消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2018-09-03
  • 1970-01-01
  • 2021-09-14
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多