该代码在一台电脑上运行,但在另一台使用相同版本的python的电脑上不运行:python配置问题



我们在2号的一个项目中通过UDP连接实现TCP机制。但我似乎有一个python配置问题。我们都使用Python 3。但这个代码对其他人有效,对我无效

以下是我运行代码时获得的信息

这是我的代码:

-服务器.py


IP = "127.0.0.1"
PORT_A = 7007
PORT_B = 6006
SYN_ACK = b"SYN_ACK6006"
END = b"END"
MAXLINE = 1024
buffer_fichier = bytearray()
buffer_ack = bytearray()
nb_segment = 0
timeout = 0.2
#socket creation
try:
socket_connect = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
print("socket creation failed")
exit()
try:
socket_transfer = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
print("socket creation failed")
exit()
socket_transfer.setblocking(0)
#socket bind
try:
socket_connect.bind((IP, PORT_A))
except socket.error:
print("socket bind failed")
exit()

print("Server waiting for a client")
#tree handshake connection
data, addr = socket_connect.recvfrom(1024)
print("Client: %s" % data)
socket_connect.sendto(SYN_ACK, addr)
print("ME: SYN_ACK")
data, addr = socket_connect.recvfrom(1024)
print("Client: %s" % data)

#open file and put it in a buffer
my_file = open("image.jpg", "rb")
bytes = my_file.read()
my_file.close()
for elem in bytes:
buffer_fichier.append(elem)
size = len(buffer_fichier)
#file sending
for i in range(0,size,MAXLINE):
buffer_segment = bytearray()
buffer_segment.append(nb_segment)
for j in range(i, i + MAXLINE):
if j < size:
buffer_segment.append(buffer_fichier[j])
else:
break
socket_transfer.sendto(buffer_segment, (IP, PORT_B))
nb_segment += 1
ready = select.select([socket_transfer], [], [], timeout)
if ready[0]:
data, addr = socket_transfer.recvfrom(1)
else:
print("pas de ack recu, probleme")
buffer_ack.append(data)
socket_transfer.sendto(END, (IP, PORT_B))
print("File of %d bytes received" %  os.path.getsize("image.jpg"))
print("nb of ack received %d" % len(buffer_ack))

-客户.py


IP = "127.0.0.1"
PORT_A = 7007
SYN = str.encode("SYN")
ACK = str.encode("ACK")
buffer_ack = bytearray()
#function to slip text and integer in a string
def text_num_split(item):
for index, letter in enumerate(item, 0):
if letter.isdigit():
return [item[:index],item[index:]]
#socket creation
try:
socket_connect = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
print("socket creation failed")
exit()
try:
socket_transfer = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
print("socket creation failed")
exit()
#tree handshake connexion
socket_connect.sendto(SYN, (IP, PORT_A))
print("Me: SYN")
data, addr = socket_connect.recvfrom(1024)
msg = text_num_split(data)
PORT_B= int(msg[1])
print("Server: %s" % data)
try:
socket_transfer.bind((IP, PORT_B)) #on bind  la socket pour qu'elle ecoute
except socket.error:                   #sur le port ou le serveur envoie le fichier
print("socket bind failed")
exit()
socket_connect.sendto(ACK, addr)
print("Me: ACK")

#Receive file
my_file = open('my_file', 'w+b')
while True:
data, addr = socket_transfer.recvfrom(1025)
if(data == "END"):
break
else:
data = bytearray(data)
buffer_ack.append(data[0])
ack = str(data[0])
socket_transfer.sendto(ack, addr)
data.pop(0)
my_file.write(data)
my_file.close()
print("File of %d bytes sent" %  os.path.getsize('my_file'))
print("nb of ack sent %d" % len(buffer_ack))

有人看到问题可能来自哪里吗?

谢谢,祝你今天愉快

Charlotte

问题是您的text_num_split,它假设您向它传递string,但您传递bytestring
bytestring将由enumerate强制转换为ints

要解决此问题,请将此行添加到您的text_num_split

item = item.decode("utf-8")

相关内容

最新更新