TCP是全双工的,安全的,不过效率低,内存消耗大

UDP是半双工的,不安全,不过效率高,内存消耗小

在工程中导入三方库AsyncSocket

TCP是需要三次握手的

 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     _mArray = [[NSMutableArray alloc] init];
 5     //客户端
 6     _clientSocket = [[AsyncSocket alloc] initWithDelegate:self];
 7     //服务端
 8     _serverSocket = [[AsyncSocket alloc] initWithDelegate:self];
 9
10     //监听有没有客户端连接
11     [_serverSocket acceptOnPort:5678 error:nil];
12 }
13
14
15 //监听到客户端连接
16 - (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket
17 {
18     [_mArray addObject:newSocket];
19     //监听客户端发送消息
20     [newSocket readDataWithTimeout:-1 tag:0];//Timeout连接超时,-1指的是永远不超时,永远等待
21
22
23 }
24
25 //当监听到克华短发送了消息
26 - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
27 {
28     NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
29     if(_textView.text.length >= 100 ){
30         _textView.text = @"";
31     }
32     //消息显示到textView上面 sock.connectedHost客户端地址
33     _textView.text = [NSString stringWithFormat:@"%@%@:%@\n",_textView.text,sock.connectedHost,str];
34     //继续监听客户端发送消息
35     [sock readDataWithTimeout:-1 tag:0];//一直监听,递归
36 }
37
38 //连接
39 - (void)conToHost:(id)sender
40 {
41     //如果已经连接,先断开
42     if(_clientSocket.isConnected){
43         [_clientSocket disconnect];
44     }
45     //连接服务端
46     [_clientSocket connectToHost:_ipField.text onPort:5678 withTimeout:20 error:nil];
47 }
48
49
50 //连接成功
51 - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
52 {
53     NSLog(@"连接成功");
54 }
55
56
57 //发送
58 - (void)sendText:(id)sender
59 {
60     NSData *data = [_sendField.text dataUsingEncoding:NSUTF8StringEncoding];
61     _sendField.text = @"";
62     [_clientSocket writeData:data withTimeout:20 tag:0];
63
64 }
65
66 //发送成功
67 - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag
68 {
69     NSLog(@"发送成功");
70 }
71
72 @end

UDP相对于TCP是简单的,不管服务器端在不在,直接发送信息

 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4     //发送端
 5     _sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
 6     //绑定端口
 7     [_sendSocket bindToPort:5555 error:nil];
 8
 9     //接收端
10     _recvSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
11     [_recvSocket bindToPort:6666 error:nil];
12
13     //监听有没有人发送消息
14     [_recvSocket receiveWithTimeout:-1 tag:0];
15 }
16
17
18
19 //接收端,监听到有人给它发消息
20 - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
21 {
22     //解析xml
23     GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
24     //解析message
25     GDataXMLElement *messageEle = doc.rootElement;
26     //解析name
27     GDataXMLElement *nameEle = [[messageEle elementsForName:@"name"] lastObject];
28     //解析text
29     GDataXMLElement *textEle = [[messageEle elementsForName:@"text"] lastObject];
30     //显示出来
31     if(_textView.text.length >=100){
32         _textView.text = @"";
33     }
34     _textView.text = [NSString stringWithFormat:@"%@%@:%@\n",_textView.text,nameEle.stringValue,textEle.stringValue];
35     //继续监听
36     [_recvSocket receiveWithTimeout:-1 tag:0];
37     return YES;
38 }
39
40
41 //发送端
42 - (void)sendText:(id)sender
43 {
44     /*
45      <?xml>
46      <message>
47          <name>...</name>
48          <text>.....</text>
49      </message>
50      */
51     GDataXMLElement *messageEle = [GDataXMLElement elementWithName:@"message"];
52     GDataXMLElement *nameEle = [GDataXMLElement elementWithName:@"name" stringValue:@"iOS"];
53     GDataXMLElement *textEle = [GDataXMLElement elementWithName:@"text" stringValue:_sendField.text];
54     [messageEle addChild:nameEle];
55     [messageEle addChild:textEle];
56
57     //加声明
58     GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithRootElement:messageEle];
59     [doc setCharacterEncoding:@"utf-8"];//编码格式
60
61     //发送消息
62     [_sendSocket sendData:doc.XMLData toHost:_ipField.text port:6666 withTimeout:20 tag:0];
63 }
64
65 //发送消息后
66 - (void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag
67 {
68
69 }
70
71
72 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
73 {
74     [self.view endEditing:YES];
75 }
76
77
78 @end

转载于:https://www.cnblogs.com/Angelone/p/4399096.html

TCP UDP 套接字相关推荐

  1. TCP/UDP套接字网络协议

    TCP服务端(以字节串传输信息) import socket 1.创建套接字 sockfd = socket.socket(socket_family = AF_INET,socket_type = ...

  2. 网络编程---TCP/UDP套接字编程原理

    本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的 本篇重在讲解原理,具体实现请戳这里->UDP套接字编程实现 介绍 网络编程套接字(s ...

  3. 计网实验原理-TCP/UDP套接字编程

    计算机网络自顶向下结构--第7版 第二章实验,套接字编程 代码运行环境:window10,python 3.8.对于书上代码略作修改. 进程与计算机网络之间的接口 多数应用程序是由通信进程队组成的,每 ...

  4. TCP/UDP 套接字总结

    参考 <<TCP/IP网络编程>> 伊圣雨 套接字简介 套接字可以连接为计算机为了通信准备的一种标准接口,这个接口函数与操作系统联系紧密,是实现计算机之间通信的重要基础. TC ...

  5. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程     1.OSI七层协议     2.基于tcp协议的套接字通信     3.模拟ssh远程执行命令     4.tcp的粘包问题及解决方案     5.基于udp协 ...

  6. tcp/ip 协议栈Linux内核源码分析15 udp套接字接收流程二

    内核版本:3.4.39 上篇我们分析了UDP套接字如何接收数据的流程,最终它是在内核套接字的接收队列里取出报文,剩下的问题就是谁会去写入这个队列,当然,这部分工作由内核来完成,本篇剩下的文章主要分析内 ...

  7. tcp/ip 协议栈Linux内核源码分析14 udp套接字接收流程一

    内核版本:3.4.39 前面两篇文章分析了UDP套接字从应用层发送数据到内核层的处理流程,这里继续分析相反的流程,看看数据是怎么从内核送到应用层的. 与发送类似,内核也提供了多个接收数据的系统调用接口 ...

  8. TCP和UDP套接字编程

    一.Socket简单介绍 如果要在应用层调用传输层的服务,进行相关程序的设计,就要涉及到套接字编程.套接字也称之为Socket,本质上它就是利用传输层提供的一系列Api来进行网络应用程序的设计. 网络 ...

  9. LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .

    const int udp_recvbufsize = 384 * 1024 ; int result = ::setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, ...

  10. Python之网络编程(TCP套接字与UDP套接字)

    文章目录 基于tcp的套接字 实现目标 tcp服务端源码 tcp客户端源码 tcp效果实现 基于udp的套接字 udp作用介绍 udp服务端源码 udp客户端源码 udp效果实现 用udp实现一个时间 ...

最新文章

  1. Mac OS X 下Node.js开发环境的搭建
  2. Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——2-5
  3. hyper-v NAT网络
  4. 文件系统服务器管理论文,Linux管理磁盘和文件系统
  5. SAP Spartacus 启动时 Chrome 里观察到的 product.js
  6. opengl层次建模_层次建模简介
  7. 用.NET模拟天体运动
  8. 支付宝:“我的小程序”用户访问量一周激增165%
  9. PAT1060. 爱丁顿数
  10. 学习心得_【数字建行大学学习心得】第二期
  11. 矩池云利用ipykernel为JupyterLab添加kernel以及展示出来
  12. matlab实心黑点怎么活,matlab画实心圆点
  13. MK60单片机开发环境-IAR Embedded Workbench的搭建
  14. eclipse语言包安装后如何进行英语中文切换
  15. 有道单词本添加js实现自动阅读单词
  16. 【sketchup 2021】草图大师图像输出与渲染之Enscape渲染(优秀的实时渲染软件)的安装与软件说明,并在sketchup软件中调出Enscape软件和使用。
  17. NSA机密文件泄密者如何暴露身份
  18. 服务器驱动器输入信号,基于GaN器件的驱动设计方案
  19. 霍志刚中国科学院计算机,曙光4000系列高性能计算机研究集体
  20. IDA反汇编/反编译静态分析iOS模拟器程序(六)交叉引用

热门文章

  1. Spark 系列(十)—— Spark SQL 外部数据源
  2. Android中的隐藏API和Internal包的使用之获取应用电量排行
  3. javascript笔记——js面试问题
  4. 老李分享:持续集成学好jenkins之解答疑问
  5. 关于Java字符串的几个重点
  6. mysql 初级练习题
  7. SecureCRT的安装、介绍、简单操作
  8. linux下的函数dirname()和basename()使用
  9. shell-数组排序
  10. Handsontable 自定义菜单 自定义命令存放位置