1

送信側の iPhone から出力ストリームを開き、受信側の iPhone に入力 (受信) ストリームも実装しました。Multipeer Connectivity を使用して同じ Wi-Fi ネットワークを介して両方のデバイスを接続し、データを送信できます (オーディオ ファイルを NSData 形式に変換して、Outputstream 経由で送信します)。コードを繰り返し実行するたびに、さまざまな量のデータが受信されます。出力ストリーム コードは次のとおりです。

     let outputStream: NSOutputStream = try! session.startStreamWithName(name, toPeer: session.connectedPeers[0])
            print("stream created")
            outputStream.delegate = self
            outputStream.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode)
            outputStream.open()
            print("Before filewritten")
            outputStream.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length)
            print("filewritten")
            outputStream.close()

そして、私の入力ストリームコードは次のとおりです。

            var bytesRead = 0
    var buffer = [UInt8](count: 15000000, repeatedValue: 0)
    NSLog("%@", "didReceiveStream")
    stream.delegate = self
    stream.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode)
    stream.open()
    while (stream.hasBytesAvailable){
       bytesRead = stream.read(&buffer, maxLength: buffer.count)
        print("data fetched"+"\(bytesRead)")
    }

        stream.close()

このデータの部分的な受信の原因と、解決策を策定するためのコードのその後の変更に関するヘルプは、非常に高く評価されます。

4

1 に答える 1

2

NSOutputStream のドキュメントは、 write(_:maxLength:) の戻りコードを次でチェックする必要があることを示しています。

let result = outputStream.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length)

戻り値: 実際に書き込まれたバイト数、またはエラーが発生した場合は -1。エラーに関する詳細情報は、streamError で取得できます。レシーバーが固定長ストリームで、その容量に達した場合は、0 が返されます。

このリターン コードを確認し、スライス単位でデータをフェッチすることをお勧めします。

于 2016-03-31T13:06:53.897 に答える