Socket: "主机" + "端口" = 套接字/插座; 仅仅是一个通信模型,不属于七层协议(网络协议).

一台电脑(IP)的一个应用程序(端口) 和 另一台电脑(IP)的应用程序(端口) 之间的通信就是通过两个socket进行连接

最常见的socket模型
一个 Socket 至少包含2层协议:网络层/传输层
TCP/IP ->socket TCP端口(传输层) IP主机(网络层)
UDP/IP ->socket UDP端口(传输层) IP主机(网络层)

思路:

1.创建一个 客户端Socket!
2.创建一个 服务器端Socket!
3.连接 两个Socket
4.客户端Socket发送聊天信息给服务器端Socket!
5.服务器端Socket接收到客户端Socket之后,返回信息给客户端Socket!
6.查看服务器端Socket传递回来的信息.

demo:

#import "ViewController.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>

@interface ViewController ()

@end

// 在终端输入以下命令: nc -lk 12345(在终端中必须开启服务器,然后设置这个端口号才能运行成功)
// 在终端输入以下命令: nc -lk 12345(在终端中必须开启服务器,然后设置这个端口号才能运行成功)
@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"touchesBegan");

// 1. 创建客户端Socket!

// Socket 参数: Socket = TCP/IP
// 参数:
// 1. AF_INET/IPv4 AF_INET6/IPv6 协议域(IP/主机)
// 2. SOCK_STREAM/TCP SOCK_DGRAM/UDP
// 3. 传0,会根据第二个参数自动选择协议类型
// 返回值: 大于0,代表客户端Socket创建成功!

int SocketNumber = socket(AF_INET, SOCK_STREAM, 0);

if (SocketNumber > 0) {

NSLog(@"客户端Socket创建成功:%d",SocketNumber);
}

// 2. 创建服务器端Socket.
struct sockaddr_in serverAddress;

// 定义服务器端Socket的协议域(IPv4)
serverAddress.sin_family = AF_INET;

// 服务器端的IP地址!
// 本机IP地址:
// 127.0.0.1(所有的计算机都有的地址!指的就是主机本身)
// 192.168.44.72 (网关动态分配的IP地址,每天都可能改变!)
// localhost :指向的就是(127.0.0.1),本机域名!
// serverAddress.sin_addr.s_addr = inet_addr("192.168.44.75");
serverAddress.sin_addr.s_addr = inet_addr("192.168.39.26");

// 设置服务器端Socket的端口号: 1024~65535
serverAddress.sin_port = htons(12345);

// 3. 连接两个Socket!
// 参数:
// 1. 客户端Socket
// 2. 服务器端Socket地址
// 3. 长度(服务器端Socket(结构体)长度).
// sizeof 计算结构体地址长度!
// 返回值:返回值=0,代表连接成功!
int result = connect(SocketNumber, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));

NSLog(@"result:%d",result);
// 要想保证连接成功,必须首先监测服务器端的端口号!
// 监测服务器端端口号: 12345
// 在终端输入以下命令: nc -lk 12345(在终端中必须开启服务器,然后设置这个端口号才能运行成功)

// 4. 客户端发送消息给服务器.
// 参数:
// 1.客户端Socket
// 2.客户端发送给服务器的内容
// 3.第二个参数的大小/长度
// 4.0,等待服务器返回内容!
// 注意: sizeof :计算的是地址长度,不是字符串长度!
// strlen:计算的是字符串的长度!

NSString *Msg = @"hello socket!";

send(SocketNumber, Msg.UTF8String, strlen(Msg.UTF8String), 0);

// 5.接收服务器端Socket返回的数据
// 参数:
// 1.客户端Socket
// 2.服务器返回的内容存放的位置.
// 3.第二个参数的长度!
// 4.传0,等待接收数据.
// 返回值: 长度.返回的数据的长度!
ssize_t buffer[1024];

ssize_t length = recv(SocketNumber, buffer, sizeof(buffer), 0);

// 从 buffer 中取出接收到的数据!
NSString *recMsg = [[NSString alloc] initWithBytes:buffer length:length encoding:NSUTF8StringEncoding];

NSLog(@"recMsg:%@",recMsg);

// AsyncSocket

}
@end

最新文章

  1. android之fragment
  2. 深入解析direct path read (转)
  3. 优化DP的奇淫技巧
  4. ASP.NET 成功执行Update 的 ExecuteNonQuery() 返回值大于0,但是查看数据库却没有改变
  5. pull刷新
  6. 【leetcode】3 SUM
  7. bzoj 1565 最大权闭合子图
  8. Ajax应用常见的HTTP ContentType设置
  9. Shuttle ESB
  10. ES(二): Build ES Cluster on Azure VM
  11. BZOJ 1337: 最小圆覆盖1336: [Balkan2002]Alien最小圆覆盖(随机增量法)
  12. 强大的健身软件——Keep
  13. mysql压缩包安装方式
  14. bzoj 1558: [JSOI2009]等差数列
  15. winform无需安装pdf阅读器打开pdf文件
  16. taro中子父传值
  17. servlet表单的get和post方法的实现
  18. java Filter过滤器例外URL设置
  19. 《web前端设计基础——HTML5、CSS3、JavaScript》 张树明版 简答题简单整理
  20. CCF-CSP 201312-5 I&#39;m stuck !

热门文章

  1. 多校HDU5723 最小生成树+dfs回溯
  2. 泛型学习第三天——C#读取数据库返回泛型集合 把DataSet类型转换为List&lt;T&gt;泛型集合
  3. Codeforces Round #372 (Div. 2) A ,B ,C 水,水,公式
  4. Tensorflow中使用CNN实现Mnist手写体识别
  5. [JSOI2016]灯塔
  6. ZOJ - 3430 ac自动机
  7. javascript queue 打字效果
  8. idea使用git上传项目到coding
  9. hdoj-1017-A Mathematical Curiosity(格式坑)
  10. 【SQL查询】查询结果分组_Group