Send/receive 使用 C# 通过 LAN 文件 to/from Python
Send/receive file over LAN with C# to/from Python
我是 Python 开发的新手,需要一些帮助。
我有一个 Raspberry Pi B+,我打算将它用作家居用品的控制器(例如在设定的时间打开泳池泵)。我非常熟悉 C#,想知道是否有一种方法可以在笔记本电脑上为 运行 编写 C# 用户界面,并以 XML 文件的形式将数据发送到 Raspberry Pi 通过 LAN 告诉 Pi 做什么。我已经用 C# 和 Python 编写了一些代码来尝试发送和接收文件,但到目前为止我的测试没有成功。
我在 Raspberry Pi 上用 Python 编写了一些基本代码,用于控制一些 GPIO 引脚,我想知道这样的连接是否可行,我是否应该重写我的 Python 也将代码写入 C#。
这是我的 C# 发送文件函数
public void SendFile(string fileName)
{
try
{
string IpAddressString = piIP;
IPEndPoint ipEnd_client = new IPEndPoint(IPAddress.Parse(IpAddressString), portnumber);
Socket clientSock_client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
string filePath = "";
fileName = fileName.Replace("\", "/");
Console.WriteLine(fileName);
while (fileName.IndexOf("/") > -1)
{
filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);
fileName = fileName.Substring(fileName.IndexOf("/") + 1);
}
byte[] fileNameByte = Encoding.UTF8.GetBytes(fileName);
if (fileNameByte.Length > 5000 * 1024)
{
Console.WriteLine("File size is more than 5Mb, please try with small file.");
return;
}
Console.WriteLine("Buffering ...");
string fullPath = filePath + fileName;
byte[] fileData = File.ReadAllBytes(fullPath);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileNameByte.Length);
Console.WriteLine("Connection to server...");
clientSock_client.Connect(ipEnd_client);
Console.WriteLine("File sending...");
clientSock_client.Send(clientData, 0, clientData.Length, 0);
Console.WriteLine("Disconnecting...");
clientSock_client.Close();
Console.WriteLine("File [" + fullPath + "] transferred.");
}
catch (Exception ex)
{
if (ex.Message == "No connection could be made because the target machine actively refused it")
Console.WriteLine("File Sending fail. Because server not running.");
else
Console.WriteLine("File Sending fail. " + ex.Message);
return;
}
connected = true;
return;
}
这是我的Python接收文件功能
import socket
import sys
s = socket.socket()
s.bind((socket.gethostname(), 8080))
s.listen(3)
while True:
#Accept connections from the outside
(clientsocket, address) = s.accept()
print(address)
i = 1
f = open('file_' + str(i) + ".xml", 'wb')
i = i + 1
while True:
l = clientsocket.recv(1024)
while l:
f.write(1)
l.clientsocket.recv(1024)
f.close()
sc.close()
s.close()
同样,到目前为止,我什至无法在两个设备之间建立连接。我应该在 Pi 上重新开始并尝试使用 C# 而不是 Python 吗?或者我错过了什么?我已经为两台设备提供了一个静态 IP 地址,并暂时在两台机器上对 IP 地址进行了硬编码。
编辑:
这是我从 C# 获得的控制台和堆栈跟踪:
Buffering ...
Connection to server...
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
File Sending fail. No connection could be made because the target machine actively refused it 10.51.21.199:8080
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
at App1.Stuffs.SendFile(String fileName) in
...Projects\App1\App1\Stuffs.cs:line 308
The thread '<No Name>' (0x1684) has exited with code 0 (0x0).
尝试使用
s.bind(('', 8080))
强制 Raspberry Pi 监听所有可用接口,因为 socket.gethostname()
可能不是您实际期望的接口。
更新:
在 Raspberry Pi 方面试试这个:
import socket
import sys
s = socket.socket()
s.bind(('', 8080))
s.listen(3)
i = 0
while True:
#Accept connections from the outside
(clientsocket, address) = s.accept()
print(address)
i = i + 1
with open('file_' + str(i) + ".xml", 'wb') as f:
while True:
l = clientsocket.recv(1024)
if not l:
break
f.write(l)
clientsocket.close()
s.close()
我有两种方法可以从 Windows PC 访问我的 Raspberry Pi。首先是在 PC 上安装 Putty 连接管理器后,输入 RPi IP 地址会在 PC 上生成一个终端 window,我可以从那里执行 RPi 程序。
RPi 连接到 Windows 工作组,在我的例子中映射为驱动器 T:。我的 C 程序可以使用它在 RPi 上创建用于写入或读取的文件。
我是 Python 开发的新手,需要一些帮助。
我有一个 Raspberry Pi B+,我打算将它用作家居用品的控制器(例如在设定的时间打开泳池泵)。我非常熟悉 C#,想知道是否有一种方法可以在笔记本电脑上为 运行 编写 C# 用户界面,并以 XML 文件的形式将数据发送到 Raspberry Pi 通过 LAN 告诉 Pi 做什么。我已经用 C# 和 Python 编写了一些代码来尝试发送和接收文件,但到目前为止我的测试没有成功。
我在 Raspberry Pi 上用 Python 编写了一些基本代码,用于控制一些 GPIO 引脚,我想知道这样的连接是否可行,我是否应该重写我的 Python 也将代码写入 C#。
这是我的 C# 发送文件函数
public void SendFile(string fileName)
{
try
{
string IpAddressString = piIP;
IPEndPoint ipEnd_client = new IPEndPoint(IPAddress.Parse(IpAddressString), portnumber);
Socket clientSock_client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
string filePath = "";
fileName = fileName.Replace("\", "/");
Console.WriteLine(fileName);
while (fileName.IndexOf("/") > -1)
{
filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);
fileName = fileName.Substring(fileName.IndexOf("/") + 1);
}
byte[] fileNameByte = Encoding.UTF8.GetBytes(fileName);
if (fileNameByte.Length > 5000 * 1024)
{
Console.WriteLine("File size is more than 5Mb, please try with small file.");
return;
}
Console.WriteLine("Buffering ...");
string fullPath = filePath + fileName;
byte[] fileData = File.ReadAllBytes(fullPath);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileNameByte.Length);
Console.WriteLine("Connection to server...");
clientSock_client.Connect(ipEnd_client);
Console.WriteLine("File sending...");
clientSock_client.Send(clientData, 0, clientData.Length, 0);
Console.WriteLine("Disconnecting...");
clientSock_client.Close();
Console.WriteLine("File [" + fullPath + "] transferred.");
}
catch (Exception ex)
{
if (ex.Message == "No connection could be made because the target machine actively refused it")
Console.WriteLine("File Sending fail. Because server not running.");
else
Console.WriteLine("File Sending fail. " + ex.Message);
return;
}
connected = true;
return;
}
这是我的Python接收文件功能
import socket
import sys
s = socket.socket()
s.bind((socket.gethostname(), 8080))
s.listen(3)
while True:
#Accept connections from the outside
(clientsocket, address) = s.accept()
print(address)
i = 1
f = open('file_' + str(i) + ".xml", 'wb')
i = i + 1
while True:
l = clientsocket.recv(1024)
while l:
f.write(1)
l.clientsocket.recv(1024)
f.close()
sc.close()
s.close()
同样,到目前为止,我什至无法在两个设备之间建立连接。我应该在 Pi 上重新开始并尝试使用 C# 而不是 Python 吗?或者我错过了什么?我已经为两台设备提供了一个静态 IP 地址,并暂时在两台机器上对 IP 地址进行了硬编码。
编辑: 这是我从 C# 获得的控制台和堆栈跟踪:
Buffering ...
Connection to server...
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
File Sending fail. No connection could be made because the target machine actively refused it 10.51.21.199:8080
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
at App1.Stuffs.SendFile(String fileName) in
...Projects\App1\App1\Stuffs.cs:line 308
The thread '<No Name>' (0x1684) has exited with code 0 (0x0).
尝试使用
s.bind(('', 8080))
强制 Raspberry Pi 监听所有可用接口,因为 socket.gethostname()
可能不是您实际期望的接口。
更新:
在 Raspberry Pi 方面试试这个:
import socket
import sys
s = socket.socket()
s.bind(('', 8080))
s.listen(3)
i = 0
while True:
#Accept connections from the outside
(clientsocket, address) = s.accept()
print(address)
i = i + 1
with open('file_' + str(i) + ".xml", 'wb') as f:
while True:
l = clientsocket.recv(1024)
if not l:
break
f.write(l)
clientsocket.close()
s.close()
我有两种方法可以从 Windows PC 访问我的 Raspberry Pi。首先是在 PC 上安装 Putty 连接管理器后,输入 RPi IP 地址会在 PC 上生成一个终端 window,我可以从那里执行 RPi 程序。
RPi 连接到 Windows 工作组,在我的例子中映射为驱动器 T:。我的 C 程序可以使用它在 RPi 上创建用于写入或读取的文件。