[Swift通天遁地]四、网络和线程-(13)创建一个Socket客户端
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10229373.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
请点击Socket服务端文章:[Swift通天遁地]四、网络和线程-(14)创建一个Socket服务端
本文将演示Socket(套接字)客户端的使用。
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
在Github中下载项目:【SwiftSocket】
在【Source】文件夹,按下【Shift】选择多个文件。
【yudpsocket.c】
【ytcpsocket.c】
【UDPClient.swift】
【TCPClient.swift】
【SwiftSocket.h】
将选择的文件拖动到项目中。点击【Finish】确认文件的导入。
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
现在开始编写代码,实现Socket(套接字)在客户端的功能。
1 import UIKit 2 //在当前的类文件中,引入已经安装的第三方类库 3 import Foundation 4 //导入需要用到的文件 5 import Darwin.C 6 7 class ViewController: UIViewController { 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view, typically from a nib. 12 13 //初始化一个按钮控件,当点击该按钮时,向服务器端发送数据。 14 let bt2 = UIButton(type: UIButtonType.roundedRect) 15 //设置按钮在页面中的显示区域 16 bt2.frame = CGRect(x: 20, y: 180, width: 280, height: 44) 17 //设置按钮的背景颜色 18 bt2.backgroundColor = UIColor.orange 19 //设置按钮的前景颜色 20 bt2.tintColor = UIColor.white 21 //设置按钮在正常状态下的标题文字 22 bt2.setTitle("client connect server", for: UIControlState()) 23 //给按钮控件绑定点击事件 24 bt2.addTarget(self, 25 action: #selector(ViewController.clientConnect(_:)), 26 for: UIControlEvents.touchUpInside) 27 28 //设置根视图的背景颜色 29 self.view.backgroundColor = UIColor.orange 30 //将按钮添加到根视图 31 self.view.addSubview(bt2) 32 } 33 34 //添加一个方法,用来响应按钮的点击事件 35 func clientConnect(_ button:UIButton) 36 { 37 //初始化一个数据传输的客户端对象,并指定IP地址和端口号。 38 let client:TCPClient = TCPClient(addr: "127.0.0.1", port: 8080) 39 //通过调用客户端对象的连接方法,并设置超时的时限, 40 //通过一个元组,获得返回的结果 41 let (success, errmsg) = client.connect(timeout: 5) 42 //当连接成功之后 43 if success 44 { 45 //连接成功之后,调用客户端对象的发送方法, 46 //向服务器发送一个字符串。 47 //同样通过一个元组,存储服务器返回的信息。 48 let (success, errmsg) = client.send(str:"AA BB CC DD" ) 49 //判断是否发送成功 50 if success 51 { 52 //调用客户端对象的读取方法,从服务器读取指定数量的内容。 53 let data = client.read(1024*10) 54 //对客户端读取的数据进行处理 55 if let d = data 56 { 57 //将数据按指定规则进行编码,并转换成字符串。 58 let xmlStr:String = String(bytes: d, encoding: String.Encoding.utf8)! 59 //创建一个警告窗口,设置相关参数。 60 let alert = UIAlertController(title: "Load data", //标题 61 message: xmlStr,//内容 62 preferredStyle: UIAlertControllerStyle.alert)//样式 63 64 //添加一个警告动作的按钮,当点击该按钮时,关闭弹出窗口。 65 let yes = UIAlertAction(title: "Yes", 66 style: UIAlertActionStyle.default, 67 handler: nil) 68 69 //将警告动作按钮,添加到警告窗口中。 70 alert.addAction(yes) 71 //在当前的的视图控制器打开警告窗口,以显示来自服务器的信息。 72 self.present(alert, animated: true, completion: nil) 73 } 74 } 75 else 76 { 77 //当传送数据失败时,同样使用警告窗口,显示错误的信息。 78 let alert = UIAlertController(title: "Error", 79 message: errmsg, 80 preferredStyle: UIAlertControllerStyle.alert) 81 82 //添加一个警告动作的按钮,当点击该按钮时,关闭弹出窗口。 83 let yes = UIAlertAction(title: "Yes", 84 style: UIAlertActionStyle.default, 85 handler: nil) 86 87 //将警告动作按钮,添加到警告窗口中。 88 alert.addAction(yes) 89 //在当前的的视图控制器打开警告窗口,以显示来自服务器的信息。 90 self.present(alert, animated: true, completion: nil) 91 //在控制台输出错误信息 92 print(errmsg) 93 } 94 } 95 else 96 { 97 //处理客户端连接服务器失败的情况 98 //当连接失败时,同样使用警告窗口,显示错误的信息。 99 let alert = UIAlertController(title: "Error", 100 message: errmsg, 101 preferredStyle: UIAlertControllerStyle.alert) 102 103 //添加一个警告动作的按钮,当点击该按钮时,关闭弹出窗口。 104 let yes = UIAlertAction(title: "Yes", 105 style: UIAlertActionStyle.default, 106 handler: nil) 107 108 //将警告动作按钮,添加到警告窗口中。 109 alert.addAction(yes) 110 //在当前的的视图控制器打开警告窗口,以显示来自服务器的错误连接信息。 111 self.present(alert, animated: true, completion: nil) 112 //在控制台输出错误信息 113 print(errmsg) 114 } 115 } 116 117 override func didReceiveMemoryWarning() { 118 super.didReceiveMemoryWarning() 119 // Dispose of any resources that can be recreated. 120 } 121 }