重用相同的套接字来发送和接收(Python)

时间:2015-08-28 10:32:17

标签: python sockets port bind listen

我编写了一个简单的脚本来使用Python套接字模块发送和接收消息。我想先使用sendMsg发送邮件,然后使用listen收到回复。 sendMsg工作正常,但当我的服务器发送响应时,我收到错误:

“[WinError 10038]尝试对不是套接字的内容进行操作”

我在sendMsg中关闭套接字连接,然后尝试在listen中绑定它,但是在此行生成错误。请有人告诉我我做错了什么!

import socket

port = 3400
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), port))

def sendMsg():

    print("\nSending message:\n\n")
    msg = ("Sample text").encode("utf-8")
    s.send(msg)
    s.close()

def listen():

    s.bind(("", port))
    s.listen(1)

    serverSocket, info = s.accept()
    print("Connection from", info, "\n")
    while 1:
        try:            
            buf = bytearray(4000)
            view = memoryview(buf)
            bytes = serverSocket.recv_into(view, 4000)
            if bytes:
                stx = view[0]
                Size = view[1:3]
                bSize = Size.tobytes()
                nTuple = struct.unpack(">H", bSize)
                nSize = nTuple[0]
                message = view[0:3+nSize]
                messageString = message.tobytes().decode("utf-8").strip()
                messageString = messageString.replace("\x00", "")
            else:
                break
        except socket.timeout:
            print("Socket timeout.")
            break

sendMsg()

listen()

注意:我已在单独的客户端中实施listen并使用了该行

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 3)

s.bind()s.connect()之前。这很好用。尽管如此,将它们全部放在一个客户端会很好。

1 个答案:

答案 0 :(得分:0)

根据文档,socket.close()将关闭套接字,并且不允许进一步操作。

因此,在您的代码中,此行s.close()正在关闭套接字。

因此,s.bind(("", port))无法正常工作,因为套接字s已经关闭!