Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NWConnection API的iOS应用程序中未通过TCP接收消息_Ios_Networking_Tcp_Client Server - Fatal编程技术网

使用NWConnection API的iOS应用程序中未通过TCP接收消息

使用NWConnection API的iOS应用程序中未通过TCP接收消息,ios,networking,tcp,client-server,Ios,Networking,Tcp,Client Server,我有一个iOS客户端应用程序,它通过TCP创建NWConnection connection = NWConnection(host: hostTCP, port: portTCP, using: .tcp) connection?.stateUpdateHandler = { [self] (newState) in print("This is stateUpdateHandler:") sw

我有一个iOS客户端应用程序,它通过TCP创建NWConnection

connection = NWConnection(host: hostTCP, port: portTCP, using: .tcp)
        connection?.stateUpdateHandler =
        { [self] (newState) in
            print("This is stateUpdateHandler:")
            switch (newState)
            {
                case .ready:
                    print("State: Ready\n")
                    self.sendTCP(messageToTCP)
                    self.receiveTCP()
                case .setup:
                    print("State: Setup\n")
                case .cancelled:
                    print("State: Cancelled\n")
                case .preparing:
                    print("State: Preparing\n")
                default:
                    print("ERROR! State not defined\n")
            }
        }
        print("connectToTCP: Connection to server started\n")
        connection?.start(queue: .global())
并且receiveTCP()函数如下所示:

func receiveTCP()
    {
        connection?.receiveMessage
        { (data, context, isComplete, error) in
            if (isComplete)
            {
                print("Receive is complete")
                if (data != nil)
                {
                    let backToString = String(decoding: data!, as: UTF8.self)
                    print("Received message: \(backToString)")
                }
                else
                {
                    print("Data == nil")
                }
            }
            else
            {
                self.receiveTCP()
            }
        }
    }
我使用命令行工具作为运行在macBook上的服务器应用程序,它侦听传入连接并发送/接收消息。 从iOS客户端应用程序发送消息可以正常工作,但接收不起作用。此外,客户端应用程序(发送和接收)也可以通过UDP正常工作。我在这里做错什么了吗

在Apple文档中

它提到

接收消息允许您处理完整的数据报或应用层消息,而无需重建流。 如果您使用的是UDP,则接收消息将传递单个数据报。 如果您请求接收一个协议上的消息,而该协议是一个无界ByTestStream,如TCP或TLS,请注意,在对等方关闭流之前,这不会传递任何数据

这意味着什么“如果您请求接收一个协议上的消息,而该协议是一个无界ByTestStream,如TCP或TLS,请注意,在对等方关闭流之前,这不会传递任何数据。”


有人知道iOS设备使用NWFramework向服务器发送和接收字符串数据的简单TCP示例吗?

TCP是一种基于流的协议。连接只是两个字节流——发送和接收。TCP中没有固有的“消息”概念。您的应用程序需要在流中施加一些框架以从中提取结构。e、 g.您可以将“hello\n”、“World\n”、“test\n”作为三个单独的呼叫发送到
send
,但所有这些数据都可以在单个数据包中发送到目的地;TCP协议栈试图优化网络利用率,发送单个较大的数据包比发送多个较小的数据包更有效

类似地,如果数据量超过网络的最大传输单位(MTU),则传递到
send
的大量数据可能作为多个分组发送。如果遇到具有较小MTU的链路,则通过Internet发送的数据甚至可以拆分为较小的数据包。TCP所能保证的只是发送的字节将按照发送顺序发送。无法保证会有多少包到达

这意味着什么“如果您请求接收一个协议上的消息,而该协议是一个无界ByTestStream,如TCP或TLS,请注意,在对等方关闭流之前,这不会传递任何数据。”

这意味着在服务器关闭TCP连接之前,您不会收到任何消息。如果服务器代码在发送响应后未关闭连接,则
receiveMessage
将无法完成。您可以使用“分块”接收响应。然后,您需要重新组合这些字符并提取消息(例如,您的消息可能会被新行终止
\n
——您需要在数据中查找新行字符,以便将接收到的数据拆分为离散的消息


Apple提供的协议允许您创建代码来解析TCP流中的消息。您实现的代码符合提供的协议,并在提供的协议上运行,以从流中提取消息并将消息编码回字节流。

非常感谢您的详细解释。receive的用法(最小完成长度:最大完成长度:完成:)解决了我的问题。