首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复局域网文件传输中的windows拒绝错误

如何修复局域网文件传输中的windows拒绝错误
EN

Stack Overflow用户
提问于 2019-08-12 18:11:22
回答 1查看 108关注 0票数 1

我是一个14岁的软件设计初学者,但对python基本知识和网络方面有很好的知识。最近我得到了一个全新的raspberry pi 3 b+,我正在尝试制作一个python程序,它将允许我将信息输入从我的hp PC传送到我的pi,这样它就可以显示信息,这个项目是为了帮助我学习,我已经输入并运行了代码,但是当我尝试运行“客户端代码”时,当我尝试运行“客户端代码”时,这样我的pi就可以接收输入数据,我收到一个错误,说设备拒绝了我的连接请求,我该怎么办来解决这个问题?如果您想查看代码,我可以发布它,但我不确定这是否必要。

我只试着在两个程序中更改端口号,因为这不是问题,而且我对LAN和网络很陌生,我没有尝试其他任何东西。

按照要求,我的代码是:(不是HTML、CSS或HTML )。使用这个界面就更容易了。

代码语言:javascript
复制
# 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')

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-13 05:45:48

不幸的是,这个答案需要Python 3.5+。

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

步骤1-确保简单的ping工作

服务器代码:

代码语言:javascript
复制
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()

客户代码:

代码语言:javascript
复制
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()

产出:

服务器:

代码语言:javascript
复制
0: 192.168.56.1
1: 192.168.1.151
 > 1
Listening on 192.168.1.151:10000

客户端:

代码语言:javascript
复制
Type ip of server
 > 192.168.1.151
Conencted to 192.168.1.151:10000
ping!

如果这不起作用,请确保您的计算机可以打开您的覆盆子皮,反之亦然。进入CMD (我猜你的HP是Windows)并输入ping ____ (用raspberry pi的内部ip地址替换____ )。

如果终端似乎没有发出什么声音,那么需要进入您的计算机,而raspberry pi则发现它们是内部的 ips,您可以了解如何在网上完成这些操作。

第二步-有趣的部分

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

服务器代码:

代码语言:javascript
复制
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()

客户代码:

代码语言:javascript
复制
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()

产出:

服务器:

代码语言:javascript
复制
0: 192.168.56.1
1: 192.168.1.151
 > 1
Listening on 192.168.1.151:10000

客户端:

代码语言:javascript
复制
IP of server
 > 192.168.1.151
Conencted to 192.168.1.151:10000
THIS IS A TEST!

再次,确保您告诉客户端连接的ip是,与您从服务器脚本中提供的列表中选择的相同。此外,确保ip地址可以连接到,即当pc在WiFi上时不要使用该地址,如果它目前在以太网上。

希望这对你有用。在评论中留下的任何问题:)

编辑

WINDOWS

来自ipconfig的样本输出

代码语言:javascript
复制
> 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

你在找这条线:

代码语言:javascript
复制
   IPv4 Address. . . . . . . . . . . : 192.168.1.151

而IP是最终的值(如192.168.1.151)。

查找您的覆盆子PI的IP

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

在你的电脑上运行这个:

代码语言:javascript
复制
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)))

如有任何问题,请让我知道:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57466173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档