TCP socket python

我只是一个虾纸丫 提交于 2021-02-05 12:11:29

问题


i am using tcp socket for forwarding data (as class with type of request, and data) between server and client. When i send 6 object of order from client, the server get only 5 object of order, 1 is lost, but tcp is reliable protocol... (sometimes the server get 6 but usually get 5)

Here's the client code

HEADERSIZE = 10
PORT = 3000
SIZE = 4096
HOST = '127.0.0.1'
soc = None
ing_map = None


def connect_to_client():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    global soc
    soc = s


def send_object(data):
    if soc is None:
        raise NotImplementedError  # There is no connection
    else:
        # make data as bytes
        msg = pickle.dumps(data)
        msg = bytes(f"{len(msg):<{HEADERSIZE}}", 'utf-8') + msg
        print(sys.getsizeof(msg))
        soc.send(msg)


def get_object(req):
    if soc is None:
        raise NotImplementedError  # There is no connection
    else:
        # unpickle the data
        send_object(req)
        if soc is None:
            raise NotImplementedError  # There is no connection
        else:
            # unpickle the data
            data = b''
            while True:
                part = soc.recv(SIZE)
                data += part
                if len(part) < SIZE:
                    break
            full_msg = data
            try:
                data = pickle.loads(full_msg[HEADERSIZE:])
            except EOFError:
                data = None
            return data


def send_order(order):
    if order is not None:
        send_object(Soc_request(Request.P_ORDER,order))


def main():

    global ing_map
    connect_to_client()
    ing_map = get_object(Soc_request(Request.G_ING_MAP, None))

    #send order
    burger = Burger(ing_map)
    salad = Salad(ing_map)
    burger.add_ingredient('ham')
    o1 = Order(Priority.NORMAL)
    o2 = Order(Priority.NORMAL)
    o3 = Order(Priority.VIP)
    o4 = Order(Priority.VIP)
    o5 = Order(Priority.PLUS)
    o6 = Order(Priority.PLUS)
    o1.meals_lst.append(burger)
    o1.meals_lst.append(burger)
    o1.meals_lst.append(burger)
    o3.meals_lst.append(burger)
    send_order(o1)
    send_order(o2)
    send_order(o3)
    send_order(o4)
    send_order(o5)
    send_order(o6)

    soc.close()

Here's the server code

HOST = '127.0.0.1'
PORT = 3000
SIZE = 1000
HEADERSIZE = 10
WORKERS = 2

conn = None
addr = None
soc = None
order_m = None


def create_connection():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen()
    global conn, addr
    global soc
    soc = s
    conn, addr = s.accept()


def send_object(data):
    if soc is None:
        raise NotImplementedError  # There is no connection
    else:
        # make data as bytes
        global conn
        msg = pickle.dumps(data)
        msg = bytes(f"{len(msg):<{HEADERSIZE}}", 'utf-8') + msg
        conn.send(msg)


def get_object():
    global conn
    if conn is None:
        raise NotImplementedError  # There is no connection
    else:
        # unpickle the data
        data = b''
        while True:
            part = conn.recv(SIZE)
            data += part
            if len(part) < SIZE:
                break
        full_msg = data
        try:
            data = pickle.loads(full_msg[HEADERSIZE:])
        except EOFError:
            data = None
        return data


def main():
    create_connection()
    # Initialize objects
    global order_m
    ing_map = Ingredient_map()
    order_m = OrderManager()

    while True:
        msg = get_object()
        if msg is None:
            pass
        elif msg.req == Request.G_ING_MAP:  # get ingredient map
            send_object(ing_map.instance.map)
        elif msg.req == Request.P_ORDER:
            order_m.add_order(msg.data)
            print(msg.data)

    # end while
    soc.close()


if __name__ == "__main__":
    main()

Request is an enum for request type.

来源:https://stackoverflow.com/questions/60411328/tcp-socket-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!