在Socket上进行多次顺序通信的正确步骤是什么?
我一直在研究套接字(socket),进展还不错,但总是遇到问题,感觉自己一定是哪里做错了,才会这么难。
网上有很多教程教你怎么实现一个TCP客户端和服务器,通常是这样的:
- 服务器在一个无限循环中运行,监听并把收到的数据回传给客户端。
- 客户端连接到服务器,发送一条消息,收到同样的回复,然后就退出。
这些我都能搞定。不过,没有人详细讲解在同两台机器或进程之间进行顺序通信时,应该做什么和不应该做什么。
我想了解一下发送多个消息的基本步骤,但为了问一个具体的问题,这里有一些限制条件:
- 每个事件都是客户端到服务器的一条消息,以及一条字符串回复。
- 消息比较短,最多100个字符。
- 事件发生得比较慢,最多大约每5秒一次,但通常会更少。
还有一些具体的问题:
- 服务器在回复后应该关闭连接,还是应该保持连接直到下次通信?
- 同样,客户端在收到回复后应该关闭连接,还是应该尝试重用连接?
- 如果连接关闭了(无论是通过
close()
还是因为某种错误),这意味着通信结束了吗,还是整个对象的生命周期结束了?- 我可以通过重新连接来重用这个对象吗?
- 我可以在服务器的同一个端口上这样做吗?
- 还是我需要通过重新调用
socket.socket()
来创建一个新的套接字对象?
- 我应该怎么做才能避免出现“地址正在使用”的错误?
- 如果
recv()
超时,套接字可以重用吗,还是应该扔掉?同样,我可以用同一个套接字对象开始一个新连接吗,还是需要一个全新的套接字?
1 个回答
2
- 如果你知道很快就会再次在这两个进程之间进行通信,那么就不需要关闭连接。不过,如果你的服务器还需要处理其他连接,那么你最好让它支持多线程。
- 同样的道理。你知道这两个进程都需要做同样的事情,对吧?
- 在客户端,你需要创建一个新的套接字,而在服务器端也不能重复使用之前的套接字:你必须使用下一个
(clientsocket, address) = serversocket.accept()
调用返回的新套接字。你可以使用相同的端口。(想想网络服务器,它们总是接受来自成千上万客户端的连接,都是通过同一个端口)
无论是关闭连接还是不关闭连接,你都应该有一个消息结束标志,比如\n
。然后你需要从套接字中读取数据,直到遇到这个标志。这个用法非常常见,以至于Python提供了一个专门的构造:socket.makefile
和file.readline
。
更新:
- 发一下你的代码。可能是你没有正确关闭连接。
- 你可以再次调用recv()。
更新2:你永远不要假设连接是可靠的,而是应该包含一些机制,以便在出现错误时能够重新连接。因此,即使有较长的间隔,尝试使用相同的连接也是可以的。至于你遇到的错误:如果你需要针对你的代码提供具体帮助,应该发一些小的(但完整的)示例。