2017-02-09 8 views
0

したがって、問題は、iOSプラットフォームのswift内でInputStreamが動作するようになっていることです。私はいくつかのコードを書いて下に投稿しますが、基本的には、iOSクライアントのIPにデータを送信するAndroidクライアントがあります。残念ながら、Androidクライアントは、接続がiOSクライアントへの接続を拒否されたと言います。私はコードがしっかりしていると思うので、私がここで間違っていることを本当に確信していないので、混乱します。ちなみにこれは私の初めてのソケット(iOS)での作業ですので、私はこれを初めて知っていて、ここではサンプルコードを学ぶことを理解してください。Swift 3(iOS)のソケットを介してデータを受け取るInputStreamを作成する

ViewControler.swift

var inputstream: InputStream? 
var outputstream: OutputStream? 
var host: CFString? 
var port: UInt32? 
override func viewDidLoad() { 
    super.viewDidLoad() 
    initNetworkCommunication() 
} 
func initNetworkCommunication(){ 
    host = "192.168.1.187" as CFString 
    port = 55555 
    var readstream : Unmanaged<CFReadStream>? 
    var writestream : Unmanaged<CFWriteStream>? 
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host!, port!, &readstream, &writestream) 

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

    inputstream?.delegate = self as! StreamDelegate 
    outputstream?.delegate = self as! StreamDelegate 


    inputstream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
    outputstream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 

    inputstream?.open() 
    Status.text = "Input Stream Opened" 
    outputstream?.open() 
    Status.text = "Output Stream Opened" 

} 
func stream(_ aStream: Stream, handleEvent eventCode: Stream.Event) { 
    switch (eventCode){ 
    case Stream.Event.errorOccurred: 
     print("Can not connect to the host!") 
     Status.text = "Cannot connect to: \(host ?? "Null Host" as CFString)" 
     break 
    case Stream.Event.endEncountered: 
     outputstream?.close() 
     outputstream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
     outputstream = nil 
     break 
    case Stream.Event.hasBytesAvailable: 
     Status.text = "Recieving data..." 
     NSLog("HasBytesAvaible") 
     var buffer = [UInt8](repeating: 0, count: 4096) 
     if (aStream == inputstream){ 
      while (inputstream?.hasBytesAvailable)!{ 
       var len = inputstream?.read(&buffer, maxLength: buffer.count) 
       if(len! > 0){ 
        Status.text = "Collected data..." 
        var data1 = NSData(bytes: buffer, length: buffer.count) 
        Status.text = "Converted Data to NSData..." 
        var str64 = data1.base64EncodedData(options: .lineLength64Characters) 
        Status.text = "Decode Base64..." 
        let data: NSData = NSData(base64Encoded: str64 , options: .ignoreUnknownCharacters)! 
        // turn Decoded String into Data 
        Status.text = "Turning Base64 data into image..." 
        let dataImage = UIImage(data: data as Data) 
        Status.text = "Done" 
        // pass the data image to image View.:) 
        Display.image = dataImage 
        Status.text = "Image Displayed" 
       } 
      } 
     } 
     break 
    case Stream.Event.openCompleted: 
     NSLog("OpenCompleted") 
     break 
    case Stream.Event.hasSpaceAvailable: 
     NSLog("HasSpaceAvailable") 
     break 
    default: 
     print("Unknown event") 
    } 
} 

答えて

0

それは、AndroidデバイスはiOSデバイスに接続しようとしている、とあなたが投稿したコードから、iOSデバイスは、Androidに接続しようとしているように聞こえますデバイス。ソケットネットワーキングの仕組みではありません。

デバイスの1つ(またはこれがピアツーピア設定の場合は両方)は、特定のポートで接続をリスンする必要があります。 iOSからリスニングソケットを作成する方法については、このガイド(https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/UsingSocketsandSocketStreams.html#//apple_ref/doc/uid/CH73-SW8)を参照してください。

+0

ここで試しているようにデバイス間の直接接続が堅牢に行うことは非常に困難であることを私は警告する必要があります。両方のデバイスが同じWi-Fiに接続されている場合でも正常に動作するかもしれませんが、それを超えて...多くの苦痛の中にあります。どのようなタイプの問題を解決しようとしていますか? –

+0

私は完全にWiFiが安定していないことを完全に理解しています。ここでは矛盾がありますが、基本的にはソケットで作業するという概念証明を得るだけです。 USB接続によるソケットははるかに簡単になります。しかし、基本的には、Android搭載端末からiOS搭載端末に1秒間に約4枚の画像を送信しようとしています。それから私はAndroidデバイスにメッセージを送り返す必要があり、基本的にこれを繰り返し繰り返します。それは疑いの余地のない複雑なプロジェクトです。助けてくれてありがとう! –

+0

ようこそ。あなたのプロジェクトに幸運を祈る! –

関連する問題