如何修复 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 的主机名将是 raspberrypi
或 raspberrypi.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)))
还有什么问题,请告诉我:)
我是一名 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.
如果终端似乎没有在 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 的主机名将是 raspberrypi
或 raspberrypi.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)))
还有什么问题,请告诉我:)