Socket通讯
2018-01-25 14:22
85 查看
Socket通讯
< GCDAsyncSocket >框架1. 创建
@property (nonatomic, strong) GCDAsyncSocket *socket; // socket @property (nonatomic, copy ) NSString *socketHost; // socket的Host @property (nonatomic, assign) UInt16 socketPort; // socket的prot self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
2. 连接
self.socketHost = self.ip.text; self.socketPort = [self.port.text intValue]; [self.socket connectToHost:self.socketHost onPort:self.socketPort error:nil]; // 断开连接 [self.socket disconnect];
3. GCDAsyncSocketDelegate
// 发送数据回调 - (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag { NSLog(@"didWriteDataWithTag"); } // 读取数据回调 - (void)socket:(GCDAsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag { NSLog(@"didReadData"); } // 连接失败回调 - (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err { NSLog(@"socketDidDisconnect"); } // 连接成功回调 - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { NSLog(@"didConnectToHost") }
系统自带
#import "ViewController.h" // 导入下面三个头文件 #import <sys/socket.h> #import <arpa/inet.h> #import <netinet/in.h> @interface ViewController () /** * IP 地址 */ @property (weak, nonatomic) IBOutlet UITextField *ipField; /** * 端口号 */ @property (weak, nonatomic) IBOutlet UITextField *portField; /** * 输入框 */ @property (weak, nonatomic) IBOutlet UITextField *inputField; /** * 显示服务器返回的结果文本标签 */ @property (weak, nonatomic) IBOutlet UILabel *recvLabel; /** * 客户端socket */ @property(nonatomic,assign) int clientSocket; @end @implementation ViewController /** * 监听连接按钮 */ - (IBAction)connect { BOOL result = [self connectToHost:self.ipField.text port:self.portField.text.intValue]; if (result) { NSLog(@"成功"); } else { NSLog(@"失败"); } self.recvLabel.text = result ? @"成功":@"失败"; } /** * 监听发送按钮 */ - (IBAction)send { // 获得用户输入的内容 NSString *msg = self.inputField.text; // 发送并接收服务响应 NSString *resultStr = [self sendAndRevc:msg]; self.recvLabel.text = resultStr; } /** * 发送数据和接收数据 */ - (NSString *)sendAndRevc:(NSString *)msg{ /* void * 等价 id 参数1:客户端的socket 参数2: 要发送的内容 参数3: 要发送内容的长度,字节 发送标示位 传0即可 */ // NSLog(@"%zd--字节长度= %ld",msg.length,strlen(msg.UTF8String)); // 发消息 ssize_t sendLength = send(self.clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0); NSLog(@"sendLength = %ld",sendLength); // 接收服务器返回的数据 /* 参数1:客户端的socket 参数2: 要接收内容才数组 参数3: 要接收内容的长度,字节 参数4:传0,标示阻塞式,等待服务器的响应 */ // 缓冲区,不能使用字符指针 uint8_t buffer[1024]; // NSLog(@"ffff = %d",sizeof(buffer)); ssize_t recvLength = recv(self.clientSocket, buffer, sizeof(buffer), 0); NSLog(@"recvLength = %ld",recvLength); // 获得服务器返回的二进制数据 NSData *data = [NSData dataWithBytes:buffer length:recvLength]; // 转换成字符串 return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } /** * 连接 */ - (BOOL)connectToHost:(NSString *)host port:(int)port{ /** 参数 domain: 协议域/协议族,AF_INET(IPV4的网络开发) type: Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文) protocol: IPPROTO_TCP,协议,如果输入0,可以根据第二个参数自动选择协议 返回值 socket,如果>0 就表示成功 */ // 创建socket self.clientSocket = socket(AF_INET, SOCK_STREAM, 0); // 连接到服务器 struct sockaddr_in serverAddress; // ip 根据ip找主机 serverAddress.sin_addr.s_addr = inet_addr(host.UTF8String); // 端口 根据端口号找程序 serverAddress.sin_port = htons(port); // 协议 确定数据的传输格式 serverAddress.sin_family = AF_INET; // 传递结构体的长度 // 成功返回0,失败返回 错误代码 // 在c语言中,一般传递结构体地址的函数,还需要传递结构体的长度 return (connect(self.clientSocket, (const struct sockaddr *)&serverAddress, sizeof(serverAddress)) == 0); }
仅供参考,错误勿怪!
相关文章推荐
- 简单的java socket通讯
- VC与linux通过socket通讯
- Socket通讯
- JAVA与VB通过SOCKET通讯
- 使用C#开发Socket通讯
- Java 与 C进行Socket通讯
- 使用C#开发Socket通讯
- socket通讯
- delphi的socket通讯
- Android模拟器与本地服务器的socket通讯
- TCP编程,Socket通讯
- Socket通讯
- iocp完成端口与socket通讯
- Socket通讯(objetive-c)客户端与(JAVA)服务端的特殊点
- socket通讯
- Java网络通讯---Socket通讯
- Socket通讯
- Socket网络通讯开发总结之:Java 与 C进行Socket通讯
- Android端与服务端基于TCP/IP协议的Socket通讯
- TCP编程,Socket通讯