注意;这里是封装出来一个工具类 创建类方法来实现客户端和服务端的socket的创建 和 分别的一些必须实现的方法
socket 通信需要一个客户端和一个服务端
客户端和服务端都得有一个socket (类似于用于通信的手机)int socket的方法
服务器端要做的操作有: 1.创建socket 2.绑定一个众所周知的地址(bind)3.处于监听状态 (listen) 4.随时处于接受请求,作出响应,accept 5.接受信息 recv
客户端要做的操作的有;1.创建socket 2.实现链接(connect)3.发送信息 send
使用socket时 要导入头文件
#import <netdb.h>
#import <arpa/inet.h>
#import "Socket.h"
@implementation Socket
//封装出类方法 创建服务端
+(void)serviceWithport:(int)port with:(Myblock)block{
dispatch_queue_t globel = dispatch_get_global_queue(0, 0);
dispatch_async(globel, ^{
// 1.创建服务端的socket
int serviceId = socket(AF_INET, SOCK_STREAM, 0);
if (!serviceId) {
NSLog(@"socket error");
return;
}
// 2.进行绑定地址
// 2.1创建地址的结构体
struct sockaddr_in addr;
// 2.1.1初始化创建的结构体
memset(&addr, 0, sizeof(addr));
// 2.1.2设置ip地址参数
addr.sin_family = AF_INET;
// 2.1.3设置ip端口
addr.sin_port = port ;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
int blindId = bind(serviceId, (struct sockaddr*)&addr, sizeof(addr));
if (blindId == -1) {
NSLog(@"bind error");
return;
}
// 3.实现监听
int listenId = listen(serviceId, 10);
if (listenId == -1) {
NSLog(@"监听失败");
return;
}
// 4.实现响应 //创建一个while 可以多次接受客户端的访问
while (1) {
int acceptid = accept(serviceId, NULL, NULL);
// 5.接收信息
// 5.1创建一个字符串数组
char str[1000];
long recvId = recv(acceptid, &str, 1000, 0);
if (recvId) {
block(str);
}
NSLog(@"str = %s",str);
}
});
}
+(void)clientWithPort:(int)port address:(NSString *)address msg:(NSString *)msg{
dispatch_queue_t globel = dispatch_get_global_queue(0, 0);
dispatch_async(globel, ^{
// 1.创建socket
int clientId = socket(AF_INET, SOCK_STREAM, 0);
if (!clientId ) {
NSLog(@"socket error");
return ;
}
// 2.进行连接
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_port = port ;
addr.sin_family = AF_INET;
// 将oc字符串地址转换成字符串
const char *str = [address UTF8String];
inet_pton(AF_INET, str, &addr.sin_addr);
// 连接connect
int connectId = connect(clientId,(struct sockaddr*) &addr, sizeof(addr));
if (connectId == -1) {
NSLog(@"connect error");
return;
}
// 将oc 字符串信息转换成C字符
const char *str2 = [msg UTF8String];
// 发送信息
send(clientId, str2, sizeof(str2), 0);
close(clientId);
});
}
@end