从套接字Swift IOS获取InputStream中的文件

时间:2016-12-20 09:39:02

标签: ios swift file sockets inputstream

我想从Swocket中的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()在服务器发送文件时不运行

1 个答案:

答案 0 :(得分:2)

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.
    }
}