在Socket上进行多次顺序通信的正确步骤是什么?

3 投票
1 回答
861 浏览
提问于 2025-04-16 23:36

我一直在研究套接字(socket),进展还不错,但总是遇到问题,感觉自己一定是哪里做错了,才会这么难。

网上有很多教程教你怎么实现一个TCP客户端和服务器,通常是这样的:

  • 服务器在一个无限循环中运行,监听并把收到的数据回传给客户端。
  • 客户端连接到服务器,发送一条消息,收到同样的回复,然后就退出

这些我都能搞定。不过,没有人详细讲解在同两台机器或进程之间进行顺序通信时,应该做什么和不应该做什么。

我想了解一下发送多个消息的基本步骤,但为了问一个具体的问题,这里有一些限制条件:

  • 每个事件都是客户端到服务器的一条消息,以及一条字符串回复。
  • 消息比较短,最多100个字符。
  • 事件发生得比较慢,最多大约每5秒一次,但通常会更少。

还有一些具体的问题:

  1. 服务器在回复后应该关闭连接,还是应该保持连接直到下次通信?
  2. 同样,客户端在收到回复后应该关闭连接,还是应该尝试重用连接?
  3. 如果连接关闭了(无论是通过close()还是因为某种错误),这意味着通信结束了吗,还是整个对象的生命周期结束了?
    1. 我可以通过重新连接来重用这个对象吗?
    2. 我可以在服务器的同一个端口上这样做吗?
    3. 还是我需要通过重新调用socket.socket()来创建一个新的套接字对象?
  4. 我应该怎么做才能避免出现“地址正在使用”的错误?
  5. 如果recv()超时,套接字可以重用吗,还是应该扔掉?同样,我可以用同一个套接字对象开始一个新连接吗,还是需要一个全新的套接字?

1 个回答

2
  1. 如果你知道很快就会再次在这两个进程之间进行通信,那么就不需要关闭连接。不过,如果你的服务器还需要处理其他连接,那么你最好让它支持多线程。
  2. 同样的道理。你知道这两个进程都需要做同样的事情,对吧?
  3. 在客户端,你需要创建一个新的套接字,而在服务器端也不能重复使用之前的套接字:你必须使用下一个(clientsocket, address) = serversocket.accept()调用返回的新套接字。你可以使用相同的端口。(想想网络服务器,它们总是接受来自成千上万客户端的连接,都是通过同一个端口)

无论是关闭连接还是不关闭连接,你都应该有一个消息结束标志,比如\n。然后你需要从套接字中读取数据,直到遇到这个标志。这个用法非常常见,以至于Python提供了一个专门的构造:socket.makefilefile.readline

更新:

  1. 发一下你的代码。可能是你没有正确关闭连接。
  2. 你可以再次调用recv()。

更新2:你永远不要假设连接是可靠的,而是应该包含一些机制,以便在出现错误时能够重新连接。因此,即使有较长的间隔,尝试使用相同的连接也是可以的。至于你遇到的错误:如果你需要针对你的代码提供具体帮助,应该发一些小的(但完整的)示例。

撰写回答