如何通过TCP/IP Socket实现树莓派与C#应用跨网络通信并解决连接问题
问题排查与解决方案
1. 修正端口不一致问题
你的Python服务器代码里使用的是port = 5001,但你提到防火墙放行的是4900端口,端口不匹配会直接导致连接失败。必须统一两者:要么把代码中的端口改为4900,要么在树莓派防火墙中放行5001端口。
2. 确保Python服务器绑定到所有网卡
服务器必须绑定到0.0.0.0才能接收来自任意设备的连接,修正后的服务器代码如下:
import socket from datetime import datetime # 统一端口,与防火墙放行端口保持一致 port = 4900 # 创建TCP Socket实例 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定到所有网卡的目标端口 s.bind(('0.0.0.0', port)) # 设置最大等待连接数 s.listen(1) print(f"服务器已启动,监听端口 {port}...") # 等待客户端连接 c, addr = s.accept() print("CONNECTION FROM:", str(addr)) dateTimeObj = str(datetime.now()) print(dateTimeObj) # 发送数据至客户端 c.send(dateTimeObj.encode()) # 若需持续通信,请勿立即关闭连接 # c.close()
3. 验证网络连通性
- 先在电脑上ping树莓派的实际IP地址,确认两台设备在同一网络下能互通(跨公网连接需额外配置端口映射,建议先完成局域网内测试)。
- 用telnet或nc工具测试端口可用性:在电脑终端执行
telnet 树莓派IP 4900,若能建立连接则端口正常;若失败,检查树莓派防火墙规则是否生效,或设备是否处于隔离VLAN中。
4. 跨设备Python客户端代码
将客户端连接地址改为树莓派的实际IP,端口与服务器保持一致:
import socket # 替换为树莓派的实际局域网IP,例如192.168.1.100 host = '192.168.1.100' port = 4900 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((host, port)) print("连接成功") while True: msg = s.recv(1024) if not msg: break print('Received date :' + msg.decode()) except ConnectionRefusedError: print("连接失败,请检查服务器状态、端口配置及网络连通性") finally: s.close()
5. C#客户端连接示例
如果使用自行开发的C#应用,可参考以下代码实现跨设备连接:
using System; using System.Net.Sockets; using System.Text; class RaspberryPiClient { static void Main() { string raspberryPiIp = "192.168.1.100"; // 替换为树莓派实际IP int targetPort = 4900; try { using (TcpClient client = new TcpClient()) { client.Connect(raspberryPiIp, targetPort); Console.WriteLine("连接成功"); using (NetworkStream stream = client.GetStream()) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) { string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("Received date: " + receivedData); } } } } catch (SocketException ex) { Console.WriteLine($"连接失败:{ex.Message}"); } } }
6. 额外注意事项
- 跨公网连接时,需在树莓派所在路由器上配置端口映射,将外部端口映射到树莓派的4900端口,客户端使用路由器的公网IP进行连接。
- 树莓派防火墙规则验证:若使用ufw防火墙,执行
sudo ufw allow 4900/tcp和sudo ufw reload确保规则生效。 - 禁止将服务器绑定到
localhost或127.0.0.1,否则仅能接收树莓派本地连接,无法响应跨设备请求。
内容的提问来源于stack exchange,提问作者OguzhanTelli35
相关产品推荐
相关产品推荐

