一台设备上会有很多的应用程序,每个应用程序会有各自的端口,一台设备最多有65535个端口。
socket就像是一个小保安,端口就像是一个大门,只有大门有小保安守着才会把门打开,如果无人把手,大门就是关着的。
所谓网络通信就像是打电话,A小区的小保安要给B小区的小保安 寄生日贺卡,必须先打电话过去问问B小保安在不在(尝试连接到服务器),如果不在(端口未开放),就不寄了。如果在,就联系快递发过去(发送消息),对方收到后,写一封感谢信回复给A小保安(请求响应)。
例如IOS 中的AFNetworking,是基与 NSURLConnection,NSURLConnection就是基于Socket。
//
// ViewController.m
// SocketDemo
//
//
#import "ViewController.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initSocket];
}
- (void)initSocket{
//初始化本地socket服务
//参数:协议(ipv4)、传输协议(tcp SOCK_STREAM /udp SOCK_DGRAM)
//请一个小保安
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
//连接服务器
//参数:客户端socket、包含ip地址和端口的结构体、数据长度
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(80);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//尝试打电话,看B小保安在不在要寄到的那个大门守着
int connectResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (connectResult == 0) {
NSLog(@"链接成功");
}else{
NSLog(@"链接失败");
return;
}
//发送数据
NSString *sendMeg = @"hello world";
//参数:客户端socket、内容地址、内容长度、发送方式标志
//发快递
ssize_t sendResultLen = send(clientSocket, sendMeg.UTF8String, sizeof(sendMeg.UTF8String), 0);
NSLog(@"发送了 %ld字节", sendResultLen);
//接受数据
//参数:客户段socket、内容缓冲区、缓冲区长度、接受方式(0 阻塞等待服务器返回数据)
uint8_t buffer[1024];
//收到感谢信
ssize_t recvResultLen = recv(clientSocket, buffer, sizeof(buffer), 0);
NSLog(@"接受到了%ld字节", recvResultLen);
NSData *data = [NSData dataWithBytes:buffer length:recvResultLen];
NSString *receiveStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", receiveStr);
//关闭链接
close(clientSocket);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
网友评论