Socket通讯
< GCDAsyncSocket >框架
1. 创建
@property (nonatomic, strong) GCDAsyncSocket *socket;
@property (nonatomic, copy ) NSString *socketHost;
@property (nonatomic, assign) UInt16 socketPort;
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{
ssize_t sendLength = send(self.clientSocket, msg.UTF8String, strlen(msg.UTF8String), 0);
NSLog(@"sendLength = %ld",sendLength);
uint8_t buffer[1024];
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 就表示成功
*/
self.clientSocket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serverAddress;
serverAddress.sin_addr.s_addr = inet_addr(host.UTF8String);
serverAddress.sin_port = htons(port);
serverAddress.sin_family = AF_INET;
return (connect(self.clientSocket, (const struct sockaddr *)&serverAddress, sizeof(serverAddress)) == 0);
}
仅供参考,错误勿怪!