我是一个14岁的软件设计初学者,但对python基本知识和网络方面有很好的知识。最近我得到了一个全新的raspberry pi 3 b+,我正在尝试制作一个python程序,它将允许我将信息输入从我的hp PC传送到我的pi,这样它就可以显示信息,这个项目是为了帮助我学习,我已经输入并运行了代码,但是当我尝试运行“客户端代码”时,当我尝试运行“客户端代码”时,这样我的pi就可以接收输入数据,我收到一个错误,说设备拒绝了我的连接请求,我该怎么办来解决这个问题?如果您想查看代码,我可以发布它,但我不确定这是否必要。
我只试着在两个程序中更改端口号,因为这不是问题,而且我对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')
发布于 2019-08-13 05:45:48
不幸的是,这个答案需要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!如果这不起作用,请确保您的计算机可以打开您的覆盆子皮,反之亦然。进入CMD (我猜你的HP是Windows)并输入ping ____ (用raspberry pi的内部ip地址替换____ )。
如果终端似乎没有发出什么声音,那么需要进入您的计算机,而raspberry pi则发现它们是内部的 ips,您可以了解如何在网上完成这些操作。
第二步-有趣的部分
现在我们将设置您的文件服务器。
服务器代码:
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地址可以连接到,即当pc在WiFi上时不要使用该地址,如果它目前在以太网上。
希望这对你有用。在评论中留下的任何问题:)
编辑
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)。
查找您的覆盆子PI的IP
除非您已经更改了一些高级设置,否则Raspberry的主机名将是raspberrypi或raspberrypi.local。我都见过了。如果您想知道IP地址,请使用下面的Python脚本,然后尝试从它打印的列表中选择所有IP,以找出哪个IP实际上是由Pi使用的。
在你的电脑上运行这个:
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)))如有任何问题,请让我知道:)
https://stackoverflow.com/questions/57466173
复制相似问题