最近工作中,使用到Socket与服务端进行交互,简单总结一下使用方法.也希望能够抛砖引玉,得到大牛的指导.
闲言少叙.
1.导入头文件.
#import "ViewController.h" #import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h>
2.连接到服务器
- (void)connnection { // 1. socket /** 参数 domain: 协议域,AF_INET(IPV4的网络开发) type: Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文) protocol: IPPROTO_TCP,协议,如果输入0,可以根据第二个参数,自动选择协议 返回值 socket,如果 > 0 就表示成功 */ int clientSocket = socket(AF_INET, SOCK_STREAM, 0); NSLog(@"socket %d", clientSocket); // 2. connect /** 参数 1> 客户端socket 2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址 服务器的"结构体"地址 提示:C 语言中没有对象 3> 结构体数据长度 返回值 0 成功/其他 错误代号,非0即真 */ struct sockaddr_in serverAddress; // 1> 协议族 serverAddress.sin_family = AF_INET; // 2> ip 找机器 inet_addr 会对地址做字节翻转 serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); // 3> 端口找程序,将整数的高低位互换(字节翻转) serverAddress.sin_port = htons(12345); int result = connect(clientSocket, (const struct sockaddr *)&serverAddress, sizeof(serverAddress)); if (result == 0) { NSLog(@"成功"); } else { NSLog(@"失败"); } // 发送 /** 参数 1> 客户端socket 2> 发送内容地址 void * == id 3> 发送内容长度 => 字节长度 4> 发送方式标志,一般为0 返回值 如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR */ NSString *msg = @"约?"; ssize_t sendLen = send(clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0); NSLog(@"发送了 %ld %tu %ld", sendLen, msg.length, strlen(msg.UTF8String)); // 接收数据 /** 参数 1> socket 2> 接收内容的地址 3> 长度 4> 接收标志,如果是0,标示阻塞式,一直等待服务器的返回数据 C语言中,数组的名字,就是指向数组第一个元素的指针 返回值 接收数据的长度 */ uint8_t buffer[1024]; ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0); NSLog(@"接收 %ld 字节", recvLen); // 获取服务器返回的二进制数据 NSData *data = [NSData dataWithBytes:buffer length:recvLen]; // 转换成字符串 NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@", str); }
3.断开连接
/// 断开连接 - (void)disconnection { close(clientSocket); }