使用NWConnection API的iOS应用程序中未通过TCP接收消息
我有一个iOS客户端应用程序,它通过TCP创建NWConnection使用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
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的用法(最小完成长度:最大完成长度:完成:)解决了我的问题。