【问题标题】:get file in InputStream from socket Swift IOS从套接字Swift IOS获取InputStream中的文件
【发布时间】:2017-05-05 11:28:41
【问题描述】:

我想从 Socket In swift 中获取输入流中的文件

从socket获取字符串的例子很多,但是没有找到任何获取socket文件的方法

// To connect to the server
func connect(host: String, port: Int) {

    SwifterHandler.sharedInstance.FilePathSave = SwifterHandler.sharedInstance.rootDoc()

    self.host = host
    self.port = port


    Stream.getStreamsToHost(withName: host, port: port, inputStream: &self.inputStream, outputStream: &self.outputStream)


    if self.inputStream != nil && self.outputStream != nil {
        self.inputStream!.delegate = self
        self.outputStream!.delegate = self
        self.inputStream!.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
        self.outputStream!.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)


        self.inputStream!.open()
        self.outputStream!.open()
    }

}


// This is a call back func that takes care of I/O from/to the server.
// Read about this func. There are many event codes to handle.
// I just wanted to make it simple.
func stream(aStream: Stream, handleEvent eventCode: Stream.Event) {
    print("Event : \(eventCode)")
    if aStream != inputStream {
        return
    }

    if eventCode == .hasBytesAvailable {
        self.ReadFile()
    }
}

private func ReadFile()
{
    var buffer = [UInt8](repeating: 0, count: 1024)
    if let fh = FileHandle(forWritingAtPath: "\(SwifterHandler.sharedInstance.FilePathSave)/test.png") {
        fh.seekToEndOfFile()
    while (self.inputStream!.hasBytesAvailable){

        let bytesRead: Int = inputStream!.read(&buffer, maxLength: buffer.count)

        if bytesRead >= 0 {



             fh.write(Data(bytes: buffer))

        }
    }



        fh.closeFile()
    }
    SwifterHandler.sharedInstance.SharedFile(path: SwifterHandler.sharedInstance.FilePathSave)
    self.dataReadCallback!("Success Download")
    InstallApp().InstallApplication()
    self.dataReadCallback!("Application Installed")

}

服务器发送文件时ReadFile()不运行

【问题讨论】:

    标签: ios swift file sockets inputstream


    【解决方案1】:
    class ViewController: UIViewController,StreamDelegate
    {
        var inputstream: InputStream?
        var outputstream: OutputStream?
        var host: String?
        var port: Int?
    
        override func viewDidLoad()
        {
            super.viewDidLoad()
    
            let _ = initNetworkCommunication()      
            let word = "Hello are you there->"
    
            let buf = [UInt8](word.utf8)
            print("This is buf = \(buf))")
    
    
            outputstream?.write(buf, maxLength: buf.count)
        }
    
        func initNetworkCommunication()
        {
            host = "127.0.0.1"      //this is IP number passing as string
            port = 34               //this is port number
    
    
            Stream.getStreamsToHost(withName: host!, port: port!,inputStream: &inputstream, outputStream: &outputstream)
    
            //here we are going to calling a delegate function
            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()
            print("Here the input stream will open")
    
            outputstream?.open()
            print("connected")
        }
    
        func stream(_ aStream: Stream, handle eventCode: Stream.Event)
        {
            print("we are in delegate method")
    
            print("EventCode = \(eventCode)")
            switch (eventCode)
            {
            case Stream.Event.openCompleted:
                if(aStream == outputstream)
                {
                    print("output:OutPutStream opened")
                }
                print("Input = openCompleted")
                break
    
            case Stream.Event.errorOccurred:
                if(aStream === outputstream)
                {
                    print("output:Error Occurred\n")
    
                }
                print("Input : Error Occurred\n")
                break
    
            case Stream.Event.endEncountered:
                if(aStream === outputstream)
                {
                    print("output:endEncountered\n")
                }
                print("Input = endEncountered\n")
                break
    
            case Stream.Event.hasSpaceAvailable:
                if(aStream === outputstream)
                {
                    print("output:hasSpaceAvailable\n")
                }
    
                print("Input = hasSpaceAvailable\n")
                break
    
            case Stream.Event.hasBytesAvailable:
                if(aStream === outputstream)
                {
                    print("output:hasBytesAvailable\n")
                }
                if aStream === inputstream
                {
                    print("Input:hasBytesAvailable\n")
    
                    var buffer = [UInt8](repeating: 0, count: 4096)
    
                    //print("input buffer = \(buffer)")
                    // sleep(40)
    
                    while (self.inputstream!.hasBytesAvailable)
                    {
                        let len = inputstream!.read(&buffer, maxLength: buffer.count)
    
                        // If read bytes are less than 0 -> error
                        if len < 0
                        {
                            let error = self.inputstream!.streamError
                            print("Input stream has less than 0 bytes\(error!)")
                            //closeNetworkCommunication()
                        }
                        // If read bytes equal 0 -> close connection
                        else if len == 0
                        {
                            print("Input stream has 0 bytes")
                            // closeNetworkCommunication()
                        }
    
    
                        if(len > 0)
                            //here it will check it out for the data sending from the server if it is greater than 0 means if there is a data means it will write
                        {
                            let messageFromServer = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue)
    
                            if messageFromServer == nil
                            {
                                print("Network hasbeen closed")
                                // v1.closeNetworkCommunication()
                            }
                            else
                            {
                                print("MessageFromServer = \(String(describing: messageFromServer))")
                            }
                        }
                    }
                }
    
                break
    
            default:
                print("default block")
            }
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    

    【讨论】:

    • 别忘了导入 UIKit
    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2018-07-12
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多