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

iPhone基于公网IP搭建Socket服务与Python工具通信问题求助

同一WiFi下iPhone与Python的Socket直连解决方案

你之前用Starscream的方式是作为客户端连接第三方WebSocket服务,并非在iPhone上搭建独立服务端,这就是不符合需求的原因。下面是无需第三方服务器、同一WiFi内网直连的实现方案:

一、iOS端搭建TCP Socket服务端(原生实现)

使用苹果官方的Network.framework(iOS 12+支持)搭建本地Socket服务端,无需依赖第三方库:

1. 配置权限

在Info.plist中添加本地网络权限申请:

<key>NSLocalNetworkUsageDescription</key>
<string>需要访问本地网络以搭建Socket服务</string>

2. 服务端核心代码示例

import Network

class SocketServerManager {
    private var listener: NWListener?
    private let port: UInt16 = 9999 // 自定义未被占用的端口

    func startServer() {
        do {
            // 监听所有网络接口的指定端口
            listener = try NWListener(using: .tcp, on: NWEndpoint.Port(rawValue: port)!)
            listener?.stateUpdateHandler = { [weak self] state in
                switch state {
                case .ready:
                    print("服务端已启动,监听端口:\(self?.port ?? 0)")
                case .failed(let error):
                    print("服务启动失败:\(error.localizedDescription)")
                default:
                    break
                }
            }

            // 处理客户端连接
            listener?.newConnectionHandler = { connection in
                print("新客户端连接:\(connection.endpoint)")
                self.handleConnection(connection: connection)
            }

            listener?.start(queue: .global())
        } catch {
            print("创建服务端失败:\(error.localizedDescription)")
        }
    }

    private func handleConnection(connection: NWConnection) {
        connection.stateUpdateHandler = { state in
            switch state {
            case .ready:
                print("客户端连接就绪")
                self.receiveData(from: connection)
            case .cancelled, .failed:
                print("客户端断开连接")
            default:
                break
            }
        }

        connection.start(queue: .global())
    }

    private func receiveData(from connection: NWConnection) {
        connection.receive(minimumIncompleteLength: 1, maximumLength: 4096) { [weak self] data, context, isComplete, error in
            if let data = data, !data.isEmpty {
                let message = String(data: data, encoding: .utf8) ?? "无法解析的消息"
                print("收到客户端消息:\(message)")

                // 回复客户端示例
                let replyData = "收到消息:\(message)".data(using: .utf8)!
                connection.send(content: replyData, completion: .contentProcessed({ error in
                    if let error = error {
                        print("发送回复失败:\(error.localizedDescription)")
                    }
                }))
            }

            if isComplete {
                print("客户端发送完毕")
                connection.cancel()
                return
            }

            if let error = error {
                print("接收数据失败:\(error.localizedDescription)")
                connection.cancel()
                return
            }

            // 继续监听下一条消息
            self?.receiveData(from: connection)
        }
    }

    func stopServer() {
        listener?.cancel()
        print("服务端已停止")
    }
}

// 使用方式
let serverManager = SocketServerManager()
serverManager.startServer()

二、Python端编写TCP客户端

使用Python标准库socket连接iPhone的局域网IP和指定端口:

import socket

# iPhone的局域网IP(比如你提供的192.168.166.168)和端口
HOST = '192.168.166.168'
PORT = 9999

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    # 发送消息到服务端
    message = "Hello from Python!"
    s.sendall(message.encode('utf-8'))
    # 接收服务端回复
    data = s.recv(1024)
    print(f"收到服务端回复:{data.decode('utf-8')}")

三、关键注意事项

  • IP确认:确保iPhone的局域网IP正确获取(可在iPhone设置→WiFi→当前网络→IP地址查看),Python设备与iPhone必须在同一WiFi网段。
  • 端口选择:避免使用系统默认占用的端口(如80、443),推荐使用1024以上的端口(示例用9999)。
  • iOS版本兼容:Network.framework要求iOS 12及以上,若需兼容更低版本,可使用BSD Socket原生API实现。
  • 防火墙设置:部分设备的防火墙可能拦截Socket连接,确保双方设备的本地网络防火墙未阻止对应端口的通信。

内容的提问来源于stack exchange,提问作者Priyank Joshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:13:31