Ios L2CAP通道,已发送但未到达的字节

Ios L2CAP通道,已发送但未到达的字节,ios,swift,core-bluetooth,l2cap,Ios,Swift,Core Bluetooth,L2cap,在iOS应用程序中,我使用coreboothL2CAP频道在一台设备和另一台设备之间进行音频文件传输。它已经发挥了一半的作用,但还没有完全发挥作用。在这一点上,我已经转移了文件名,但谈到文件内容,情况如下 在发送端,所有字节(几十万字节)都被发送到几个块上。但在接收端,似乎只有前几千字节到达目的地 职能: func stream(_ aStream: Stream, handle eventCode: Stream.Event) { ...... } 调用一次(

在iOS应用程序中,我使用
corebooth
L2CAP频道在一台设备和另一台设备之间进行音频文件传输。它已经发挥了一半的作用,但还没有完全发挥作用。在这一点上,我已经转移了文件名,但谈到文件内容,情况如下

在发送端,所有字节(几十万字节)都被发送到几个块上。但在接收端,似乎只有前几千字节到达目的地

职能:

func stream(_ aStream: Stream,
            handle eventCode: Stream.Event) {
    ......
}

调用一次(使用Stream.Event.hasBytesAvailable)并获取前几千个字节。但后来就再也没有人叫它了。原因可能是什么?我希望在收到所有字节之前,可以根据需要多次调用它。

在完成
读取
后,需要检查流的
hasBytesAvailable
属性,如果为真,则发出另一个
读取
。不能调用事件处理程序

例如:

func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
    switch eventCode {
    case Stream.Event.openCompleted:
        print("Stream is open")
    case Stream.Event.endEncountered:
        print("End Encountered")
    case Stream.Event.hasBytesAvailable:
        print("Bytes are available")
        self.readBytes(from: aStream as! InputStream)
    case Stream.Event.hasSpaceAvailable:
        print("Space is available")
    case Stream.Event.errorOccurred:
        print("Stream error")
    default:
        print("Unknown stream event")
    }
}

func readBytes(from stream: InputStream) {
    let bufLength = 1024
    let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufLength)
    let bytesRead = stream.read(buffer, maxLength: bufLength)
    print("bytesRead = \(bytesRead)")
    self.bytesReceived += bytesRead
    if stream.hasBytesAvailable {
        self.readBytes(from: stream)
    }
}
func流(\aStream:stream,handle-eventCode:stream.Event){
开关事件代码{
case Stream.Event.openCompleted:
打印(“流已打开”)
case Stream.Event.endencounted:
打印(“遇到结束”)
case Stream.Event.hasbytes可用:
打印(“字节可用”)
self.readBytes(来自:aStream as!InputStream)
case Stream.Event.hasspace可用:
打印(“空间可用”)
case Stream.Event.error发生:
打印(“流错误”)
违约:
打印(“未知流事件”)
}
}
func readBytes(来自流:InputStream){
设bufLength=1024
let buffer=UnsafeMutablePointer.allocate(容量:bufLength)
let bytesRead=stream.read(缓冲区,maxLength:BuflLength)
打印(“字节读=\(字节读)”)
self.bytesReceived+=bytesRead
如果stream.hasbytes可用{
self.readBytes(来自:流)
}
}

请显示您的发送代码。收到一些字节后,应检查流上的
hasBytesAvailable
,如果还有可用字节,则再次调用
read
。您不能依赖正在调用的事件处理程序。在largedata分支中检查我更新的外围代码。我没有意识到必须运行这个:if stream.hasBytesAvailable{self.readBytes(from:stream)}我认为stream函数是自动调用的,并且完成了所有的操作。我试试看。