-1

現在、NSNetService クラスを使用して 2 つの IOS デバイスを接続するプログラムに取り組んでいます。両方のデバイスを接続できますが、getInoutStream 関数を使用してデータを送信する方法がわかりません。どんな仲間でも私を助けることができますか?

4

1 に答える 1

1

multipeerを使用しないのはなぜですか? これは、あなたがやろうとしていることに対するはるかに簡単な解決策です。また、NSNetService には既知のバグがいくつかあります。ただし、NSNetService で Bonjour 接続をセットアップすることにより、2 つの間でデータを送信します。getInputStream メソッドには、タイプ UnsafeMutablePointer の引数が必要です。

    public func getInputStream(inputStream: UnsafeMutablePointer<NSInputStream?>, outputStream: UnsafeMutablePointer<NSOutputStream?>) -> Bool

var inputStream : NSInputStream?
var outputStream : NSOutputStream?

let success = service.getInputStream(&inputStream, outputStream: &outputStream)

次に、メモリ ストリームを使用してデータを書き込むだけで、リスナー ポートに渡されます。

これは完成したコードです:

この関数は、127.0.0.1 で接続を開始します

func initNetworkCommunication(){
    var host : CFString = "127.0.0.1"
    var port : UInt32 = 7001
    var readstream : Unmanaged<CFReadStream>?
    var writestream : Unmanaged<CFWriteStream>?
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readstream, &writestream)

    inputstream = readstream!.takeRetainedValue()
    outputstream = writestream!.takeRetainedValue()

    inputstream.delegate = self
    outputstream.delegate = self


    inputstream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    outputstream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)

    inputstream.open()

これはストリーム IO 用です。

func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { //This is the stream IO function. It allows RW of the stream
        switch (eventCode){
    case NSStreamEvent.ErrorOccurred:
        NSLog("ErrorOccurred")
        break
    case NSStreamEvent.EndEncountered:
        NSLog("EndEncountered")
        break
    case NSStreamEvent.None:
        NSLog("None")
        break
    case NSStreamEvent.HasBytesAvailable:
        NSLog("HasBytesAvaible")
        var buffer = [UInt8](count: 4096, repeatedValue: 0)
        if ( aStream == inputstream){

            while (inputstream.hasBytesAvailable){
                var len = inputstream.read(&buffer, maxLength: buffer.count) 
                if(len > 0){
                    var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding) 
                    if (output != ""){
                        NSLog("server said: %@", output!)
                    }
                }
            } 
        }
        break
    case NSStreamEvent.allZeros:
        NSLog("allZeros")
        break
    case NSStreamEvent.OpenCompleted:
        NSLog("OpenCompleted")
        break
    case NSStreamEvent.HasSpaceAvailable:
        NSLog("HasSpaceAvailable")
        break
   default:
        // default code here
        break
  }
于 2016-04-29T08:16:33.893 に答える