标签 网络 下的文章

使用GCDAsyncSocket基本使用

//
//  ViewController.swift
//  socket练习-聊天室客户端
//
//  Created by admin on 16/3/16.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,GCDAsyncSocketDelegate {

    @IBOutlet weak var messageTableView: UITableView!
    @IBOutlet weak var messageTextField: UITextField!
    @IBOutlet weak var messageView: UIView!
    var socket:GCDAsyncSocket?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.messageTableView.delegate = self
        self.messageTableView.dataSource = self
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardFrameChange:"), name: UIKeyboardWillChangeFrameNotification, object: nil)
        self.view.bringSubviewToFront(self.messageView)
    }
    func keyboardFrameChange(not:NSNotification)
    {
        /**
        {
        UIKeyboardAnimationCurveUserInfoKey = 7;
        UIKeyboardAnimationDurationUserInfoKey = "0.25";
        UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {375, 258}}";
        UIKeyboardCenterBeginUserInfoKey = "NSPoint: {187.5, 796}";
        UIKeyboardCenterEndUserInfoKey = "NSPoint: {187.5, 538}";
        UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 667}, {375, 258}}";
        UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 409}, {375, 258}}";
        UIKeyboardIsLocalUserInfoKey = 1;
        }
        */
        let begingFrame:CGPoint = (not.userInfo!["UIKeyboardCenterBeginUserInfoKey"]?.CGPointValue)!
        let endFrame:CGPoint = (not.userInfo!["UIKeyboardCenterEndUserInfoKey"]?.CGPointValue)!
        if (begingFrame.y - endFrame.y) > 0
        {
            // 弹出
            self.messageView.transform = CGAffineTransformMakeTranslation(0, -(begingFrame.y - endFrame.y))
        }
        else
        {
            self.messageView.transform = CGAffineTransformIdentity
        }
    }
    deinit
    {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    // 建立连接
    @IBAction func connection(sender: UIBarButtonItem) {
        //ios里实现sokcet的连接,使用C语言

        // 1.与服务器通过三次握手建立连接
        let host:CFString = "127.0.0.1"
        let port:UInt16 = 52013

        self.socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_global_queue(0, 0))

        let res = try? self.socket?.connectToHost(host as String, onPort: port)
        if res != nil
        {
            print("ok")
        }
        else
        {
            print("error")
        }
    }
    // 连接完成
    func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) {
        print("连接")
    }
    func socketDidDisconnect(sock: GCDAsyncSocket!, withError err: NSError!) {
        if err == nil
        {
            print("断开连接")
        }
        else
        {
            print("发生错误了。。。。")
        }
    }
    // 写入数据,需要读取下,不然后面不能进行
    func socket(sock: GCDAsyncSocket!, didWriteDataWithTag tag: Int) {
        socket?.readDataWithTimeout(-1, tag: tag)
    }
    // 读取数据
    func socket(sock: GCDAsyncSocket!, didReadData data: NSData!, withTag tag: Int) {
        let res = NSString(data: data, encoding: NSUTF8StringEncoding)
        if tag == 8888
        {
            print(res)
        }
        else if tag == 6888
        {
            NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                self.messages.append(res!)
                self.messageTableView.reloadData()
            })
        }
    }
    @IBAction func login(sender: UIBarButtonItem) {
        let str = "login:zhangsan"
        self.socket?.writeData(str.dataUsingEncoding(NSUTF8StringEncoding), withTimeout: -1, tag: 8888)
    }
    var messages:[NSString] = []
    @IBAction func sendMessage(sender: UITextField) {
        let message:NSString = sender.text!
        if(message.length > 0)
        {
            self.socket?.writeData("message:\(message)".dataUsingEncoding(NSUTF8StringEncoding), withTimeout: -1, tag: 6888)
        }
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return self.messages.count
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("MessageCell")
        cell?.textLabel?.text = self.messages[indexPath.row] as String
        return cell!
    }
}

iOS中socket的基本使用

//
//  ViewController.swift
//  socket练习-聊天室客户端
//
//  Created by admin on 16/3/16.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController,NSStreamDelegate,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet weak var messageTableView: UITableView!
    @IBOutlet weak var messageTextField: UITextField!
    var inputStream:NSInputStream?
    var outputStream:NSOutputStream!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.messageTableView.delegate = self
        self.messageTableView.dataSource = self
    }
    // 建立连接
    @IBAction func connection(sender: UIBarButtonItem) {
        //ios里实现sokcet的连接,使用C语言

        // 1.与服务器通过三次握手建立连接
        let host:CFString = "127.0.0.1"
        let port:UInt32 = 52013

        // 2.定义输入输出流

        var readStream:Unmanaged<CFReadStream>?
        var writeStream:Unmanaged<CFWriteStream>?

        // 3.分配输入输出流的内存空间
//        CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);

        CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readStream, &writeStream)

        // 4.把C语言的输入输出流转成OC对象

        self.inputStream = readStream?.takeRetainedValue()
        self.outputStream = writeStream!.takeUnretainedValue()

//        _inputStream = (__bridge NSInputStream *)readStream;
//        _outputSteam = (__bridge NSOutputStream *)(writeStream);
//        

        // 5.设置代理,监听数据接收的状态
        self.inputStream?.delegate = self
        self.outputStream?.delegate = self
        // 把输入输入流添加到主运行循环(RunLoop)
        // 主运行循环是监听网络状态
        self.inputStream?.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
        self.outputStream?.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)

        // 6.打开输入输出流
        self.inputStream?.open()
        self.outputStream.open()
    }
    @IBAction func login(sender: UIBarButtonItem) {
        let str = "login:zhangsan"
        self.sendData(str)
        let res = self.readData()
        print(res)
    }
    var messages:[NSString] = []
    @IBAction func sendMessage(sender: UITextField) {
        let message:NSString = sender.text!
        if(message.length > 0)
        {
            self.sendData("message:\(message)")
            let res = self.readData()
            self.messages.append(res)
            self.messageTableView.reloadData()
        }
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return self.messages.count
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("MessageCell")
        cell?.textLabel?.text = self.messages[indexPath.row] as String
        return cell!
    }
    // 代理方法,在不同的状态会调用这个方法
    func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
        switch(eventCode)
        {
        case NSStreamEvent.OpenCompleted:
                print("建立连接成功,形成输入输出流通道")
            break
        case NSStreamEvent.HasBytesAvailable:
            print("可以读取数据")
            break
        case NSStreamEvent.HasSpaceAvailable:
            print("可以发送数据")
            break
        case NSStreamEvent.ErrorOccurred:
            print("发生错误")
            break
        case NSStreamEvent.EndEncountered:
            print("正常断开连接")
            // 关闭输入输出流,并从主运行循环中移除
            self.inputStream?.close()
            self.inputStream?.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
            self.outputStream.close()
            self.outputStream?.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
            break
        default:
            break
        }
    }
    // 发送数据
    func sendData(dataString:NSString)
    {
        let data:NSData = dataString.dataUsingEncoding(NSUTF8StringEncoding)!
        self.outputStream.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length)
    }
    func readData()->NSString
    {

        var buffer = [UInt8](count: 1024, repeatedValue: 0)
        let len = self.inputStream?.read(&buffer, maxLength: buffer.count)
        var res:NSString = ""
        //
        if len > 0
        {
            res = NSString(bytes: buffer, length: buffer.count, encoding: NSUTF8StringEncoding)!
        }
        return res
    }
}

VFL的使用

和http://jinblog.com/archives/520.html的文章两个例子完成的效果一样,注意格式

//
//  ViewController.swift
//  UIDynamic的使用
//
//  Created by admin on 16/2/29.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var viewA: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.constraintB()
    }
    func constraintB()
    {
        // 创建控件
        let viewA = UIView()
        viewA.translatesAutoresizingMaskIntoConstraints = false
        viewA.backgroundColor = UIColor.blueColor()
        self.view.addSubview(viewA)
        let viewB = UIView()
        viewB.translatesAutoresizingMaskIntoConstraints = false
        viewB.backgroundColor = UIColor.brownColor()
        self.view.addSubview(viewB)
        // 创建约束
        // 水平
        let viewAh = NSLayoutConstraint.constraintsWithVisualFormat("H:|-30-[viewA]-30-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["viewA" : viewA])
        // 垂直
        let viewAv = NSLayoutConstraint.constraintsWithVisualFormat("V:|-30-[viewA(50)]-[viewB(==viewA)]", options: NSLayoutFormatOptions.AlignAllRight, metrics: nil, views: ["viewA" : viewA,"viewB" : viewB])
        // 比例值,需要用构造方法来完成
        let viewBwidth = NSLayoutConstraint(item: viewB, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: viewA, attribute: NSLayoutAttribute.Width, multiplier: 0.5, constant: 0)
        // 添加约束
        self.view.addConstraint(viewBwidth)
        self.view.addConstraints(viewAh)
        self.view.addConstraints(viewAv)
//        let viewB
    }
    func constaintA()
    {
        // 创建控件
        let viewA = UIView()
        viewA.translatesAutoresizingMaskIntoConstraints = false
        viewA.backgroundColor = UIColor.blueColor()
        self.view.addSubview(viewA)
        let viewB = UIView()
        viewB.translatesAutoresizingMaskIntoConstraints = false
        viewB.backgroundColor = UIColor.brownColor()
        self.view.addSubview(viewB)

        // 创建约束
        // 水平方向,左右有间距,要加“|”,并把间距用“-”分隔
        let viewAh = NSLayoutConstraint.constraintsWithVisualFormat("H:|-30-[viewA]-[viewB(==viewA)]-30-|", options: NSLayoutFormatOptions.AlignAllBottom, metrics: nil, views: ["viewA" : viewA,"viewB" : viewB])
        // 垂直方向,左边没有约束就不要加 “|”,直接固定数字,直接写数字,不要加等号
        let viewAv = NSLayoutConstraint.constraintsWithVisualFormat("V:[viewA(50)]-30-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["viewA" : viewA])
        self.view.addConstraints(viewAh)
        self.view.addConstraints(viewAv)
        // 没有对齐,传这个值就行
        let viewBv = NSLayoutConstraint.constraintsWithVisualFormat("V:[viewB(==viewA)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["viewA" : viewA,"viewB" : viewB])
        self.view.addConstraints(viewBv)
    }
}

AFNetworking基本使用

//
//  ViewController.swift
//  AFNet使用
//
//  Created by admin on 16/2/29.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.upload()
    }
    func upload()
    {
        let configuretion = NSURLSessionConfiguration.defaultSessionConfiguration()
        let manager = AFHTTPSessionManager(sessionConfiguration: configuretion)
        // 获得文件url
        let pathUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("1.jpg", ofType: nil)!)
        manager.POST("http://test.com/upload.php", parameters: nil, constructingBodyWithBlock: { (formData:AFMultipartFormData) -> Void in
            // 添加文件
            try? formData.appendPartWithFileURL(pathUrl, name: "uploadFile[]", fileName: "newImage.jpg", mimeType: "image/jpeg")
            // try? formData.appendPartWithFileURL(pathUrl, name: "uploadFile[]", fileName: "newImage.jpg", mimeType: "image/jpeg")
            }, progress: { (progress:NSProgress) -> Void in
                print(progress)// 上传进度
            }, success: { (task:NSURLSessionDataTask, data:AnyObject?) -> Void in
                print(data) // 返回的数据
            }) { (task:NSURLSessionDataTask?, error:NSError) -> Void in
                print(error) // 错误
        }
    }
    func get()
    {
        let manager = AFHTTPSessionManager()
        let data = ["username":"张三","password":"zhang"]
        manager.GET("http://test.com/login.php", parameters: data, success: { (task:NSURLSessionDataTask, data:AnyObject?) -> Void in
            print(data)
            }) { (task:NSURLSessionDataTask?, error:NSError) -> Void in
                print(error.userInfo)
        }
    }
    func post()
    {
        let manage = AFHTTPSessionManager()
        let data = ["username":"张三","password":"zhang"]
        manage.POST("http://test.com/login.php", parameters: data, progress: { (progress:NSProgress) -> Void in
            print(progress)
            }, success: { (task:NSURLSessionDataTask, data:AnyObject?) -> Void in
                print(data)
            }) { (task:NSURLSessionDataTask?, error:NSError) -> Void in
                print(error)
        }
    }
}

NSURLSession的使用

//
//  ViewController.swift
//  session使用
//
//  Created by zhang on 16/2/28.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController,NSURLSessionDownloadDelegate {

    @IBOutlet weak var progress: UIProgressView!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.downloadA()
    }
    // oc的代理是强引用,swift的不是
    lazy var session:NSURLSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: self, delegateQueue: nil)
    // 存放task
    var task:NSURLSessionDownloadTask?
    // 存放断点续传的数据
    var resumeData:NSData?
    // 可以显示下载进度,暂停继续的下载
    @IBAction func start(button:UIButton)
    {
        // 初始化task
        self.task = session.downloadTaskWithURL(NSURL(string: "http://localhost/1.mp4")!)
        // 初始化data
        self.resumeData = nil
        // 开始
        self.task?.resume()
    }
    // 停
    @IBAction func stop(button:UIButton)
    {
        // 停止
        self.task?.cancelByProducingResumeData({ (data:NSData?) -> Void in
            // 记录当前data
            self.resumeData = data
            // 置空task
            self.task = nil
        })
        print(self.task)
    }
    // 继续
    @IBAction func resume(button:UIButton)
    {
        if self.resumeData != nil
        {
            // 根据上次暂停时的data初始化task
            self.task = session.downloadTaskWithResumeData(self.resumeData!)
            // 初始化data
            self.resumeData = nil
            // 继续
            self.task?.resume()
        }
        else
        {
            print("没有暂停过的任务或者有任务正在运行")
        }

    }
    // 下载完成时执行
    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
        print("下载完成了")
    }
    // 下载进度发生变化时执行
    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
        NSOperationQueue.mainQueue().addOperationWithBlock { () -> Void in
            self.progress.progress = Float(Float64(totalBytesWritten) / Float64(totalBytesExpectedToWrite))
        }
    }
    // 下载和解压zip,需要用到第三方的库
    func downloadA()
    {
        let downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(NSURL(string: "http://localhost/zip.zip")!) { (url:NSURL?, response:NSURLResponse?, error:NSError?) -> Void in
            SSZipArchive.unzipFileAtPath(url?.path, toDestination: "/Users/zhang/Desktop/path/")
        }
        downloadTask.resume()
    }
    // 发送请求
    func request()
    {
        let session = NSURLSession.sharedSession()
        let dataTask = session.dataTaskWithURL(NSURL(string: "http://localhost/demo.json")!) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in

            print(try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments))
        }
        dataTask.resume()
    }
}