如何修复 LAN 文件传输的 windows 拒绝错误

How to fix windows decline error for lan file transfer

我是一名 14 岁的软件设计初学者,但对 python 网络的基础和敏锐知识有很好的了解。我最近得到了一个 raspberry pi 3 b+ 全新的,我正在尝试制作一个 python 程序,允许我将我的 hp PC 输入的信息传输到我的 pi,以便它可以显示信息,这个项目是为了帮助我完成学业,我输入了代码并且它是 运行s 但是当我尝试 运行 "client code" 时,这样我的 pi 就可以接收输入数据,我得到一个错误说设备拒绝了我的连接请求,我应该怎么做才能解决这个问题?如果你想看代码,我可以 post,但我不确定是否有必要。

我只尝试更改两个程序中的端口号,因为这不是问题所在,而且我是 LAN 和网络方面的新手,我没有尝试过其他任何东西。

根据要求,我的代码是:(不是 HTML、CSS 或 HTML。使用该界面更容易。

# send.py

import socket                   # Import socket module

port = 60000                    # Reserve a port for your service.
s = socket.socket()             # Create a socket object
host = socket.gethostname()     # Get local machine name
s.bind((host, port))            # Bind to the port
s.listen(5)                     # Now wait for client connection.

print 'Server listening....'

while True:
    conn, addr = s.accept()     # Establish connection with client.
    print 'Got connection from', addr
    data = conn.recv(1024)
    print('Server received', repr(data))

    filename='mytext.txt'
    f = open(filename,'rb')
    l = f.read(1024)
    while (l):
       conn.send(l)
       print('Sent ',repr(l))
       l = f.read(1024)
    f.close()

    print('Done sending')
    conn.send('Thank you for connecting')
    conn.close()


# recieve.py

import socket                   # Import socket module

s = socket.socket()             # Create a socket object
host = socket.gethostname()     # Get local machine name
port = 60000                    # Reserve a port for your service.

s.connect((host, port))
s.send("Hello server!")

with open('received_file', 'wb') as f:
    print 'file opened'
    while True:
        print('receiving data...')
        data = s.recv(1024)
        print('data=%s', (data))
        if not data:
            break
        # write data to a file
        f.write(data)

f.close()
print('Successfully get the file')
s.close()
print('connection closed')

很遗憾,这个答案需要 Python 3.5+。

在 运行 此代码之前,请确保您已经计算出您将用于服务器和客户端的 IP(帮助在底部)。

第 1 步 - 确保简单的 ping 工作正常

服务器代码:

import socket

# FIND IP

# The IP to use will be different depending
# on whether you have WiFi or Ethernet, so
# you need to choose whichever one that is
ips = socket.gethostbyname_ex(socket.gethostname())[-1]

print(*[f"{i}: {j}" for i, j in enumerate(ips)], sep="\n")

ip = ips[int(input(" > "))]

# SELECT PORT

port = 10000


#SETUP SERVER

# Create server socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((ip, port))

# A queue of 1 clients is more than enough for our application
sock.listen(1)

print(f"Listening on {ip}:{port}")

while True:
    try:
        (clientsock, address) = sock.accept()

        # so if there's nothing to read we don't wait too long
        clientsock.settimeout(0.01)

        ping_string = clientsock.recv(5).decode()

        if ping_string == "ping!":
            print("ping!")

            clientsock.sendall(b"ping!")

        else:
            print("no ping!")
            print(ping_string)

            clientsock.sendall(b"nopng")

        clientsock.shutdown(1)
        clientsock.close()

    except KeyboardInterrupt:
        # Add a way to safely exit the infinite loop
        break

sock.close()

客户代码:

import socket

# GET IP

print("IP of server")
ip = input(" > ")

# SELECT PORT

port = 10000


# SETUP SOCKET

# Create server socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))

print(f"Conencted to {ip}:{port}")

# so if there's nothing to read we don't wait too long
sock.settimeout(0.01)

sock.sendall(b"ping!")

ping_string = sock.recv(5).decode()

if ping_string == "ping!":
    print("ping!")

else:
    print("no ping!")

sock.close()

输出:

服务器:

0: 192.168.56.1
1: 192.168.1.151
 > 1
Listening on 192.168.1.151:10000

客户:

Type ip of server
 > 192.168.1.151
Conencted to 192.168.1.151:10000
ping!

如果这不起作用,请确保您的计算机可以 ping 您的 raspberry pi,反之亦然。进入 CMD(我假设您的 HP PC 是 Windows)并输入 ping ____(将 ____ 替换为您的 raspberry pi.

的内部 IP 地址

如果终端似乎没有在 ping 某些东西,您需要进入您的计算机并raspberry pi找到它们内部 ips,你可以在网上找到如何做。

第 2 步 - 有趣的部分

我们现在要设置您的文件服务器。

服务器代码:

import socket

# OPEN FILE TO SEND ACROSS
with open("filesend.txt", mode="rb") as file:
    file_string = file.read()

# FIND IP

# The IP to use will be different depending
# on whether you have WiFi or Ethernet, so
# you need to choose whichever one that is
ips = socket.gethostbyname_ex(socket.gethostname())[-1]

print(*[f"{i}: {j}" for i, j in enumerate(ips)], sep="\n")

ip = ips[int(input(" > "))]

# SELECT PORT

port = 10000


#SETUP SERVER

# Create server socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((ip, port))

# A queue of 1 clients is more than enough for our application
sock.listen(1)

print(f"Listening on {ip}:{port}")

while True:
    try:
        (clientsock, address) = sock.accept()

        # so if there's nothing to read we don't wait too long
        clientsock.settimeout(0.01)

        # send length
        clientsock.sendall((str(len(file_string)) + ".").encode())
        clientsock.sendall(file_string)

        print("Sent file!")

        response_code = clientsock.recv(1).decode()

        if response_code != "0":
            print("ERROR! response was not 0")
            print(response_code)


        clientsock.shutdown(1)
        clientsock.close()

    except KeyboardInterrupt:
        # Add a way to safely exit the infinite loop
        break

sock.close()

客户代码:

import socket

# SELECT IP

print("IP of server")
ip = input(" > ")

# SELECT PORT

port = 10000


# SETUP SOCKET

# Create server socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))

print(f"Conencted to {ip}:{port}")

# so if there's nothing to read we don't wait too long
sock.settimeout(0.01)

# Get length of file sent across
len_string = ""
c = ""
while c != ".":
    c = sock.recv(1).decode()
    len_string += c

length = int(len_string[:-1])

file_string = sock.recv(length)

# send a status code back to the server
sock.sendall(b"0")

with open("filerecv.txt", mode="wb") as file:
    file.write(file_string)

print(file_string.decode())

sock.close()

输出:

服务器:

0: 192.168.56.1
1: 192.168.1.151
 > 1
Listening on 192.168.1.151:10000

客户:

IP of server
 > 192.168.1.151
Conencted to 192.168.1.151:10000
THIS IS A TEST!

再次确保您告诉客户端连接的 IP 与您从服务器脚本中提供的列表中选择的 IP 相同。还要确保 ip 地址可以连接到,即如果电脑当前在以太网上,则不要使用 wifi 上的 ip 地址。

希望这对你有用。有什么问题请在评论中留下:)

编辑

WINDOWS

来自 ipconfig 的示例输出:

> ipconfig

Windows IP Configuration


Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . : home
   IPv6 Address. . . . . . . . . . . : 2a00:23c6:6586:2400:e47a:c60e:812b:1123
   IPv6 Address. . . . . . . . . . . : fdaa:bbcc:ddee:0:e47a:c60e:812b:1123
   Temporary IPv6 Address. . . . . . : 2a00:23c6:6586:2400:d1fe:95f5:27c3:c4b8
   Temporary IPv6 Address. . . . . . : fdaa:bbcc:ddee:0:d1fe:95f5:27c3:c4b8
   Link-local IPv6 Address . . . . . : fe80::e47a:c60e:812b:1123%19
   IPv4 Address. . . . . . . . . . . : 192.168.1.151
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : fe80::8aa6:c6ff:fe23:7a15%19
                                       192.168.1.254

您正在查找此行:

   IPv4 Address. . . . . . . . . . . : 192.168.1.151

并且 IP 是末尾的任何值(例如 192.168.1.151

查找您的 RASPBERRY PI

的 IP

除非您更改了一些高级设置,否则您的 Raspberry Pi 的主机名将是 raspberrypiraspberrypi.local。我都见过。如果您想知道 IP 地址,请使用下面的 Python 脚本,并尝试从它打印的列表中 ping 所有 IP 以找出 Pi 实际使用的 IP。

运行 在您的 PC 上:

import socket

host1 = "raspberrypi"
host2 = "raspberrypi.local"

try:
    ip1 = socket.gethostbyname_ex(host1)[-1]
except:
    ip1 = []

try:
    ip2 = socket.gethostbyname_ex(host2)[-1]
except:
    ip2 = []

print(list(set(ip1+ip2)))

还有什么问题,请告诉我:)