TCP-сокет python - PullRequest
       4

TCP-сокет python

0 голосов
/ 26 февраля 2020

Я использую сокет TCP для пересылки данных (как класс с типом запроса и данных) между сервером и клиентом. Когда я отправляю 6 объектов заказа от клиента, сервер получает только 5 объектов заказа, 1 теряется, но tcp является надежным протоколом ... (иногда сервер получает 6, но обычно получает 5)

Вот код клиента

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()

Вот код сервера

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()

Запрос является перечислением для типа запроса.

...