创建通过Swift 3(iOS)中的套接字接收数据的InputStream

创建通过Swift 3(iOS)中的套接字接收数据的InputStream,ios,swift,sockets,Ios,Swift,Sockets,因此,我的问题是让InputStream在iOS平台的swift中工作。我写了一些代码并将在下面发布,但基本上我有一个Android客户端,它将数据发送到iOS客户端的IP。不幸的是,安卓客户端称连接被拒绝,无法连接到iOS客户端。我真的不太确定我在这里做错了什么,因为我认为代码看起来很可靠,所以我有点困惑。顺便说一句,这是我第一次在swift(iOS)中使用套接字,所以请理解我是新手,我在这里学习示例代码 ViewControler.swift var inputstream: InputSt

因此,我的问题是让InputStream在iOS平台的swift中工作。我写了一些代码并将在下面发布,但基本上我有一个Android客户端,它将数据发送到iOS客户端的IP。不幸的是,安卓客户端称连接被拒绝,无法连接到iOS客户端。我真的不太确定我在这里做错了什么,因为我认为代码看起来很可靠,所以我有点困惑。顺便说一句,这是我第一次在swift(iOS)中使用套接字,所以请理解我是新手,我在这里学习示例代码

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")
    }
}
var-inputstream:inputstream?
var outputstream:outputstream?
var主机:CFString?
var端口:UInt32?
重写func viewDidLoad(){
super.viewDidLoad()
initNetworkCommunication()
}
func initNetworkCommunication(){
host=“192.168.1.187”作为CFString
端口=55555
var readstream:非托管?
var writestream:非托管?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault、host!、port!、readstream和writestream)
inputstream?=readstream!.takeRetainedValue()
outputstream?=writestream!.takeRetainedValue()
inputstream?.delegate=自身为!StreamDelegate
outputstream?.delegate=自身为!StreamDelegate
inputstream?.schedule(in:RunLoop.current,forMode:RunLoopMode.defaultRunLoopMode)
outputstream?.schedule(in:RunLoop.current,forMode:RunLoopMode.defaultRunLoopMode)
inputstream?.open()
Status.text=“输入流已打开”
outputstream?.open()
Status.text=“输出流已打开”
}
func stream(uastream:stream,handleEvent事件代码:stream.Event){
开关(事件代码){
case Stream.Event.error发生:
打印(“无法连接到主机!”)
Status.text=“无法连接到:\(主机??“空主机”为CFString)”
打破
case Stream.Event.endencounted:
outputstream?.close()
outputstream?.remove(从:RunLoop.current,forMode:RunLoopMode.defaultRunLoopMode)
outputstream=nil
打破
case Stream.Event.hasbytes可用:
Status.text=“正在接收数据…”
NSLog(“hasbytesavailable”)
变量缓冲区=[UInt8](重复:0,计数:4096)
if(aStream==inputstream){
while(输入流?.hasbytes可用){
var len=inputstream?.read(&buffer,maxLength:buffer.count)
如果(len!>0){
Status.text=“收集的数据…”
var data1=NSData(字节:buffer,长度:buffer.count)
Status.text=“已将数据转换为NSData…”
var str64=data1.base64EncodedData(选项:.lineLength64个字符)
Status.text=“解码Base64…”
let data:NSData=NSData(base64Encoded:str64,选项:。忽略未知字符)!
//将解码的字符串转换为数据
Status.text=“正在将Base64数据转换为图像…”
让dataImage=UIImage(数据:数据作为数据)
Status.text=“完成”
//将数据图像传递到图像视图。:)
Display.image=dataImage
Status.text=“显示的图像”
}
}
}
打破
case Stream.Event.openCompleted:
NSLog(“OpenCompleted”)
打破
case Stream.Event.hasspace可用:
NSLog(“HasSpaceAvailable”)
打破
违约:
打印(“未知事件”)
}
}

听起来Android设备正在尝试连接到iOS设备,从您发布的代码来看,iOS设备正在尝试连接到Android设备。套接字网络不是这样工作的


其中一个设备(或两者,如果这是对等设置)需要侦听特定端口上的连接。有关从iOS创建侦听套接字的信息,请参阅本指南()

我觉得我应该警告您,在您尝试在这里建立设备之间的直接连接是非常困难的。当两台设备都在同一个wifi上时,它可能工作正常,但除此之外。。。你会很痛苦的。你想解决什么类型的问题?所以我完全理解WiFi并不是超级稳定的,这里会有很多不一致的地方,但基本上这只是为了得到一个使用插座的概念证明,这样一旦我弄清楚WiFi的东西,我就可以通过USB连接将插座布线,这将更容易。但基本上我尝试每秒从安卓设备向iOS设备发送大约4张图像。然后,我需要向Android设备发送一条消息,并基本上一遍又一遍地循环这个过程。毫无疑问,这是一个复杂的项目。谢谢你的帮助!当你能够让基础工作正常进行时,请在此发帖。