python客户机tcp套接字可以用于多个发送吗?

2024-10-01 15:44:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用一个插座发送两个信号。第一个成功,下一个失败。 从http://docs.python.org/howto/sockets.html 似乎应该允许多次发送。不管是好是坏,我真的不需要从插座上读。 我想用一个扭曲的应用程序来进行通信(如果我已经使用了一个扭曲的应用程序,但是我可以使用它来帮助。。这是一个单独的连接)。在

“连接完成后,可以使用套接字s发送对页面文本的请求。同一个套接字将读取应答,然后被销毁。没错,被摧毁了。客户机套接字通常只用于一个交换(或一小组顺序交换)。“

发送成功的返回值=35 返回值失败=32

通过一些小的编辑来删除任何业务逻辑的代码。在

self._commandSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)


def sendPrereqs(self,id,prereqs):
    self._commandSock.connect(self._commandConnection)
    #parse prereqs
    temp = prereqs.split(',')
    for pair in temp:
        tup = pair.partition(':')
        try:
            command = 'some command'
            logging.info('sending command: ' + command)
            ret = self._commandSock.send(command)
            if ret == None:
                logging.info('send called successfully: ' + command)
            else:
                logging.info('socket returned non-None: ' + str(ret))
        except:

            print 'Unexpected Exception ', sys.exc_info()[0]()
            print sys.exc_info()
            #logging.info('Unexpected Exception '+ str(sys.exc_info()[0]()))
            #logging.info(' ' + str(sys.exc_info()))
    self._commandSock.close()`

Tags: selfinfo应用程序loggingsyssockettempcommand
2条回答

文档仅涉及一个常见的场景。您可以在所有套接字上任意调用^{}^{}^{},只要套接字没有关闭。在

注意,这些方法返回发送的字节数,32和35只是意味着第一次发送32字节,第二次发送35字节。在

socket.send无异常返回的事实意味着数据已被交给操作系统,但并不意味着它实际到达了端点(或被那里的应用程序正确读取)。在

return value for the send that succeeds = 35 return value for the send that FAILS = 32

Documentation says that successful send should return None.

不,不是的。Documentation说:

Returns the number of bytes sent. Applications are responsible for checking that all data has been sent; if only some of the data was transmitted, the application needs to attempt delivery of the remaining data. For further information on this concept, consult the Socket Programming HOWTO.

你还没有解释你所说的“失败”是什么意思。send调用正在成功返回,它几乎可以肯定地将32个字节放入了套接字写入缓冲区。在

如果您认为它失败的唯一原因是它返回了正确的值,那么答案显然是它没有失败。在

如果其他事情出了问题,那么在更高的层次上,可能会出现各种各样的错误。一种可能的情况是这样的:服务器(特别是如果它是由不太理解套接字的人编码的)被编码为期望一个35字节的recv(),而另一个是32字节的recv()。但是它实际上得到了一个67字节的recv(),并且永远等待第二个字节,而第二个永远不会到来。没有规则保证流(TCP)套接字上的每个send()对应于另一端的一个recv()。您需要创建某种流协议来划分单独的消息。在

同时,你所指的引语是无关紧要的。它描述了简单的web浏览器如何使用客户端套接字:它们建立一个连接,执行一个发送,接收所有数据,然后销毁连接。我可以理解为什么它误导了你,你可能想提交一个文档错误来改进它。但现在,就不管它。在

如果您想绝对确保客户机发送的数据是正确的,而问题出在服务器上,有两种简单的方法可以做到:

  1. {{7}把服务器替换成服务器{7},你应该用{6000服务器来代替}。

  2. 使用Wireshark监视客户端和服务器之间的连接。

一旦确认问题出在服务器端,就需要调试服务器。如果你需要帮助,最好用一个新的问题来回答,你可以发布服务器代码而不是客户端,并解释(这里有一个链接)你确信客户端发送的信息是正确的。在

相关问题 更多 >

    热门问题