【问题标题】:closing the client socket causes an Error after the message is sent发送消息后关闭客户端套接字会导致错误
【发布时间】:2019-09-20 14:35:04
【问题描述】:

我想知道关闭客户端套接字导致错误消息的原因(如下所示:)

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() 时没有错误 - 那么如何正确关闭客户端套接字?谢谢

【问题讨论】:

    标签: python python-3.x sockets network-programming


    【解决方案1】:

    recv 在发送套接字关闭时返回b''

    msg[:headersize]msg 为空时返回b''

    int(b'') 给出了您所看到的错误。

    如果套接字关闭,以下将退出客户端的内部while True:循环,因此它不会尝试处理空消息。我看不到外部while True: 的目的。

    msg = client.recv(headersize + 4)
    if not msg:  # empty strings are False
        break
    

    【讨论】:

    • 谢谢 - 我没有检查服务器是否没有发送消息!
    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 2018-09-08
    • 2018-05-16
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多