Socket网络编程

2018-07-22  本文已影响12人  灰斗儿

一台设备上会有很多的应用程序,每个应用程序会有各自的端口,一台设备最多有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
上一篇下一篇

猜你喜欢

热点阅读