socket模型
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
socket模型的更多相关文章
- 手把手教你玩转SOCKET模型之重叠I/O篇(下)
四. 实现重叠模型的步骤 作 了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了.其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会 如何来使用它,却 ...
- .NET平台下几种SOCKET模型的简要性能供参考
转载自:http://www.cnblogs.com/asilas/archive/2006/01/05/311309.html .NET平台下几种SOCKET模型的简要性能供参考 这个内容在cnbl ...
- Socket模型(二):完成端口(IOCP)
为什么要采用Socket模型,而不直接使用Socket? 原因源于recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他链接不能继续.这样我们又 ...
- 转:变手把手教你玩转SOCKET模型之重叠I/O篇
手把手教你玩转SOCKET模型之重叠I/O篇 “身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙 ...
- php socket 模型及效率问题
// 创建套接字 socket_create(); // 绑定 socket_bind(); // 监听 socket_listen(); // 主体, 死循环 while(true){ // sel ...
- PJSIP Socket 模型
前些日子为解决项目中问题调试到PJSIP Socket收发数据部分 ,好记性不如烂笔头,记录下 PJSIP 使用的Socket 模型 ,以备后用. 不同平台下PJSIP采用不同的 Socket模型,W ...
- Socket模型详解(转)
两种I/O模式 一.选择模型 二.异步选择 三.事件选择 四.重叠I/O模型 五.完成端口模型 五种I/O模型的比较 两种I/O模式 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待 ...
- 手把手教你玩转SOCKET模型之重叠I/O篇(上)
“身为一个初学者,时常能体味到初学者入门的艰辛,所以总是想抽空作点什么来尽我所能的帮助那些需要帮助的人.我也希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯付 ...
- socket模型处理多个客户端
最近学完了简单的socket编程,发现其实socket的网络编程其实并没有什么难度,只是简单的函数调用,记住客户端与服务端的步骤,写起来基本没有什么问题. 在服务器程序的设计中,一个服务器不可能只相应 ...
随机推荐
- eclipse添加删除插件-eclipse marketplace
源文地址:http://jingyan.baidu.com/article/cdddd41c5c883353cb00e19e.html 在有些版本的eclips上并没有eclipse marketpl ...
- 3Sum,4Sum问题
//三数和为0的问题.要求去重,并且输出数字有序.public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(n ...
- MATLAB中feval与eval的区别
feval函数有两种调用形式1.[y1, y2, ...] = feval(fhandle, x1, ..., xn)2.[y1, y2, ...] = feval(fname, x1, ..., x ...
- mysql数据库优化课程---2、命令其实也就是那几个单词
mysql数据库优化课程---2.命令其实也就是那几个单词 一.总结 一句话总结: 比如show,use,alter 1.开启和关闭mysql服务? Windows下:net start/stop m ...
- IIS7配置PHP简要说明
1. IIS7 安装的时候 要注意三个地方打得勾 万维网服务->应用程序开发功能->CGI ->ISAPI扩展 ->ISAPI筛选器 注: CGI 会在IIS7+PHP_ ...
- ZOJ - 3430 ac自动机
这题主要就是解码过程很恶心,不能用char存,一共wa了20发 题意:先给n串加密后的字符,然后m串加密后的字符,解码之后求n对应每个m的匹配数,很显然的ac自动机 加密过程是先用对应ascii表的标 ...
- CSS3 之 RGBa 可透明颜色
在 CSS3 中,增加了一个 opacity 属性,允许开发者设置元素的透明度,现在 opacity 已被主流的现代浏览器支持,但 opacity 会把被设置的元素及其子元素同时设置为同一个透明度,这 ...
- tag问题
- 织梦dedecms如何批量替换文章内容和缩略图
文章来自:http://blog.sina.com.cn/s/blog_475ea1130101co6w.html 第一种方法: 进入后台,点左侧的采集,点选批量维护的数据库内容替换. 1.替换标题内 ...
- BZOJ - 2618 凸多边形 (半平面交)
题意:求n个凸多边形的交面积. 半平面交模板题. #include<bits/stdc++.h> using namespace std; typedef long long ll; ty ...