gpt4 book ai didi

python - 无法在不同计算机上使用套接字传输文件

转载 作者:行者123 更新时间:2023-12-04 07:19:16 25 4
gpt4 key购买 nike

我最近用 Python 写了一个文件传输代码。当我从同一系统上的不同终端连接它们时,套接字连接正常。但是,当我从通过同一个 Wifi 网络连接的不同计算机连接它们时,这似乎不起作用。
这是服务器代码:

import os 
import socket

# Creating a socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(("192.164.X.X",2222))
sock.listen(5)
print("Host Name: " , sock.getsockname())

# Accepting the connection
client , addr = sock.accept()

# Getting file details
file_name = input("File Name:")
file_size = os.path.getsize(file_name)

# Sending file name and details
client.send(file_name.encode())
client.send(str(file_size).encode())

# Opening file and sending data
with open(file_name,"rb") as file:
c = 0
while c <= file_size:
data = file.read(1024)
if not (data):
break
client.sendall(data)
c += len(data)


# closing the socket
sock.close()

这是我的客户代码:
import os
import socket

host = input("Host Name: " )
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Trying to connect to socket

sock.connect((host,2222))
print("Connected Successfully")

# send file details
file_name = sock.recv(100).decode()
file_size = sock.recv(100).decode()

with open("./rec/" + file_name , "wb") as file:
c = 0

while c <= int(file_size):
data = sock.recv(1024)
if not (data):
break
file.write(data)
c += len(data)


sock.close()

当我尝试从另一台计算机连接客户端时,出现此错误:
while c <= int(file_size):
ValueError: invalid literal for int() with base 10: '3hi\n'
我要传输的文件只有一个单词“hi”。
文件传输可以从同一台机器上的不同终端正常工作。但同样不适用于通过同一 wifi 网络连接的不同计算机。
我了解错误(尝试将 string 转换为 int )但我不了解 为什么它正在发生以及如何解决它。

最佳答案

您的服务器代码正在发送一个包含多个 client.send() 内容的 TCP 数据包。来电。这通常称为“软木塞”,通常可以使用 socket.TCP_NODELAY 禁用(取决于您的操作系统)。接受连接后的套接字选项。

client, addr = sock.accept() 
client.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
但是,这不能保证有效,并且取决于您的操作系统和操作系统设置。
真正的解决方案是创建一个更健壮的协议(protocol)并避免依赖以不同数据包发送的数据。事实上,这是实现任何基于 TCP 的协议(protocol)的唯一明智的方法。永远不要依赖以特定方式将数据拆分为数据包。
确定编码和发送长度的固定大小,然后在服务器上执行以下操作:
  • 为文件名发送一个长度(固定大小,例如 8 个字符或 8 个字节,或任何您想要的)。
  • 发送文件名。
  • 发送文件大小(还是固定大小)。
  • 发送文件内容。

  • 在客户端时:
  • 准确接收 8 个字节并解码长度。
  • 接收文件名的精确长度字节。
  • 准确接收 8 个字节并解码文件大小。
  • 接收文件内容的确切大小字节。

  • 最重要的是,请注意 .recv() sockets的方法可以返回小于请求的数量(你似乎已经知道了),所以无论你需要做什么类型的接收操作,你都需要在循环中累积数据,直到你收到预期的数量,例如:
    expected = 100
    data = b''

    while len(data) < expected:
    data += sock.recv(expected - len(data))

    关于python - 无法在不同计算机上使用套接字传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68605799/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com