【发布时间】:2020-06-10 13:17:00
【问题描述】:
我正在使用 tcp 套接字在服务器和客户端之间转发数据(作为具有请求类型和数据的类)。当我从客户端发送 6 个订单对象时,服务器只得到 5 个订单对象,1 个丢失,但 tcp 是可靠的协议......(有时服务器得到 6 个但通常得到 5 个)我的问题是为什么一个对象丢失了通过tcp转发?
这是客户端代码
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()
服务器的输出是 订单 0 订单 1 订单 3 订单 4 订单 5 但订单 2 输了! 为什么?我应该如何解决所有订单都会到达? Request 是请求类型的枚举。
【问题讨论】:
-
这不是一个可重现的例子。您正在调用示例中未定义或导入的类和函数。请提供一个最小的可重现示例,我们将尽力为您提供帮助。 stackoverflow.com/help/minimal-reproducible-example
-
你可以看到github.com/Ofekroz10/Restaurant中的全部代码 class back 是服务器,class main 是客户端 其他代码不需要,无论我发送订单对象还是猫对象,都有问题是我从客户端发送 6 个对象,而服务器只得到 5 个
-
此代码与代码in this question 惊人地相似。这些有关系吗?
-
您能至少在一定程度上缩小问题范围吗?需要处理大量代码,不是吗?
-
@MisterMiyagi 这是什么问题?好像已经被删除了。
标签: python python-3.x sockets tcp