重复使用同一个套接字来发送和接收 (Python)
Reuse the same socket to send and receive (Python)
我已经编写了一个简单的脚本来使用 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()
之前。这工作正常。不过,如果能在一个客户端中实现所有功能就好了。
根据文档,socket.close() 将关闭套接字并且不允许对其进行进一步的操作。
所以在您的代码中,这一行 s.close()
正在关闭套接字。
因此 s.bind(("", port))
将无法工作,因为套接字 s
已经关闭!
我已经编写了一个简单的脚本来使用 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()
之前。这工作正常。不过,如果能在一个客户端中实现所有功能就好了。
根据文档,socket.close() 将关闭套接字并且不允许对其进行进一步的操作。
所以在您的代码中,这一行 s.close()
正在关闭套接字。
因此 s.bind(("", port))
将无法工作,因为套接字 s
已经关闭!