You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:10:33