发送消息后关闭客户端套接字会导致错误
closing the client socket causes an Error after the message is sent
我想知道关闭客户端套接字导致错误消息的原因(如下所示:)
Traceback (most recent call last):
File "client.py", line 39, in <module>
main()
File "client.py", line 35, in main
accept()
File "client.py", line 21, in accept
len_msg = int(msg[:headersize])
ValueError: invalid literal for int() with base 10: b''
这是服务器端
import socket
import time
import pickle
def connect(data, headersize = 10, looped = False):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.bind((socket.gethostname(), 1234))
server.listen(5)
while True:
client_socket, address = server.accept()
print(f"connection with {address} has been established")
msg = pickle.dumps(data)
msg = bytes(f"{len(msg):<{headersize}}", "utf-8") + msg
client_socket.send(msg)
if looped:
while True:
msg = f"{time.time()} + the new message"
client_socket.send(msg)
client_socket.close() # this causes an error
def main():
data = {"apple":5, "pinapple":10}
connect(data)
if __name__ == "__main__":
main()
这是客户端
import socket
import time
import pickle
def accept(headersize = 10):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client:
client.connect((socket.gethostname(), 1234))
while True:
new_msg = True
full_msg = b""
len_msg = 0
while True:
msg = client.recv(headersize + 4)
if new_msg:
len_msg = int(msg[:headersize])
new_msg = False
full_msg += msg
if len(full_msg) - headersize == len_msg:
print(full_msg[headersize:])
d = pickle.loads(full_msg[headersize:])
print(d)
full_msg = b""
new_msg = True
def main():
accept()
if __name__ == "__main__":
main()
程序很简单:我只是将消息以二进制形式发送给客户端。当我在服务器端删除 client_socket.close()
时没有错误 - 那么如何正确关闭客户端套接字?谢谢
recv
returns b''
当发送套接字关闭时。
msg[:headersize]
当 msg
为空时 returns b''
.
int(b'')
给出了您看到的错误。
如果套接字已关闭,以下内容将退出客户端的内部 while True:
循环,因此它不会尝试处理空消息。我看不到外部 while True:
.
的目的
msg = client.recv(headersize + 4)
if not msg: # empty strings are False
break
我想知道关闭客户端套接字导致错误消息的原因(如下所示:)
Traceback (most recent call last):
File "client.py", line 39, in <module>
main()
File "client.py", line 35, in main
accept()
File "client.py", line 21, in accept
len_msg = int(msg[:headersize])
ValueError: invalid literal for int() with base 10: b''
这是服务器端
import socket
import time
import pickle
def connect(data, headersize = 10, looped = False):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.bind((socket.gethostname(), 1234))
server.listen(5)
while True:
client_socket, address = server.accept()
print(f"connection with {address} has been established")
msg = pickle.dumps(data)
msg = bytes(f"{len(msg):<{headersize}}", "utf-8") + msg
client_socket.send(msg)
if looped:
while True:
msg = f"{time.time()} + the new message"
client_socket.send(msg)
client_socket.close() # this causes an error
def main():
data = {"apple":5, "pinapple":10}
connect(data)
if __name__ == "__main__":
main()
这是客户端
import socket
import time
import pickle
def accept(headersize = 10):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client:
client.connect((socket.gethostname(), 1234))
while True:
new_msg = True
full_msg = b""
len_msg = 0
while True:
msg = client.recv(headersize + 4)
if new_msg:
len_msg = int(msg[:headersize])
new_msg = False
full_msg += msg
if len(full_msg) - headersize == len_msg:
print(full_msg[headersize:])
d = pickle.loads(full_msg[headersize:])
print(d)
full_msg = b""
new_msg = True
def main():
accept()
if __name__ == "__main__":
main()
程序很简单:我只是将消息以二进制形式发送给客户端。当我在服务器端删除 client_socket.close()
时没有错误 - 那么如何正确关闭客户端套接字?谢谢
recv
returns b''
当发送套接字关闭时。
msg[:headersize]
当 msg
为空时 returns b''
.
int(b'')
给出了您看到的错误。
如果套接字已关闭,以下内容将退出客户端的内部 while True:
循环,因此它不会尝试处理空消息。我看不到外部 while True:
.
msg = client.recv(headersize + 4)
if not msg: # empty strings are False
break