[Swift通天遁地]四、网络和线程-(13)创建一个Socket客户端

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10229373.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

目录:[Swift]通天遁地Swift

请点击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,  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 }
原文地址:https://www.cnblogs.com/strengthen/p/10229373.html