通过套接字进行多个顺序通信的正确程序是什么?

时间:2011-08-15 06:46:19

标签: python sockets

我一直在努力与套接字一起努力,取得良好的进展,但我一直遇到问题,并且觉得我必须做错事情才能做到这一点。

有很多教程可以实现TCP客户端和服务器,通常在:

  • 服务器以无限循环运行,监听并回送客户端数据。
  • 客户端连接到服务器,发送消息,接收相同的内容,然后退出

我可以处理。但是,似乎没有人详细介绍您应该和不应该使用相同的两台机器/进程之间的顺序通信。

我是在执行多个消息的函数调用的一般序列之后,但是为了提出一个真正的问题,这里有一些约束:

  • 每个事件都是单个消息客户端 - >服务器和单个字符串响应。
  • 消息很短,最多100个字符。
  • 事件发生的速度相对较慢,最多比例为每5秒1次,但通常不到速度的一半。

和一些具体问题:

  1. 服务器应该在响应后关闭连接,还是尝试挂断连接直到下一次通信?
  2. 同样,客户端应该在收到响应后关闭连接,还是尝试重用连接?
  3. 关闭连接(通过close()或通过某种错误)是指通信结束还是整个对象的生命周期结束?
    1. 我可以再次连接重用该对象吗?
    2. 我可以在服务器的同一端口上这样做吗?
    3. 或者我是否重新调用了另一个套接字对象,并重新调用socket.socket()
  4. 我应该怎么做以避免“使用中的地址”错误?
  5. 如果recv()超时,套接字是否可重复使用,还是应该将其丢弃?同样,我可以使用相同的套接字对象启动新连接,还是需要一个全新的套接字?

1 个答案:

答案 0 :(得分:2)

  1. 如果您知道您将很快再次在两个进程之间进行通信,则无需关闭连接。如果您的服务器也必须处理其他连接,那么您希望将其设置为多线程。
  2. 同样的。你知道两者都必须做同样的事情,对吗?
  3. 您必须在客户端上创建一个新套接字,并且您也不能在服务器端重用套接字:您必须使用下一个(clientsocket, address) = serversocket.accept()调用返回的新套接字。您可以使用相同的端口。 (想想网络服务器,他们总是接受来自数千个客户端的同一端口的连接)
  4. 在这两种情况下(关闭或不关闭),您应该有一个消息终止符号,例如\n。然后你必须从插座读取,直到你到达标志。这种用法很常见,python有一个构造:socket.makefilefile.readline

    更新:

    1. 发布代码。可能你还没有正确关闭连接。
    2. 您可以再次调用recv()。
    3. 更新2: 您永远不应该假设连接是可靠的,但包括在出现错误时重新连接的机制。因此,即使间隙较长,也可以尝试使用相同的连接。 至于你得到的错误:如果你需要特定的代码帮助,你应该发布小(但完整)的例子。