本文共 2670 字,大约阅读时间需要 8 分钟。
Objective-C实现局域网双向通信
在局域网环境中实现双向通信,常用的协议包括UDP和TCP。本文将使用TCP协议提供一个简单的实现示例。我们将创建一个客户端和服务器应用程序,服务器监听客户端连接请求,客户端发送消息到服务器并接收响应。
TCP服务器(Server)
// Server.m
#import <Foundation/Foundation.h>
@interface TCPServer : NSObject
@end
@implementation TCPServer
(void)startServerWithPort:(int)port {
// 服务器socket创建
int socketFD = socket(port, SOCK_STREAM, 0);
// 绑定IP和端口
if (bind(socketFD, &sin_addr, sizeof(sin_addr)) == 0) {
NSLog(@"服务器绑定成功");
} else {
NSLog(@"绑定失败");
}
// listen
if (listen(socketFD, backlog) == 0) {
NSLog(@"服务器处于监听状态");
} else {
NSLog(@"监听失败");
}
}
(void)acceptClient {
struct sockaddr_in client_addr;
int new_socketFD = socket( AF_INET, SOCK_STREAM, 0 );
if (new_socketFD == 0) {
return;
}
int opt = 1;
if (setsockopt(new_socketFD, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
NSLog(@"setsockopt失败");
}
if (bind(new_socketFD, &client_addr, sizeof(client_addr))) {
NSLog(@"绑定失败");
}
if (listen(new_socketFD, backlog) == 0) {
NSLog(@"监听成功");
} else {
NSLog(@"监听失败");
}
while (true) {
int addrlen = sizeof(client_addr); int new_clientFD = accept(new_socketFD, &client_addr, &addrlen); if (new_clientFD == -1) { NSLog(@"接受失败"); break; } // 处理客户端连接 // 读取消息 char buffer[1024]; int read_size = read(new_clientFD, buffer, sizeof(buffer)); if (read_size == -1) { NSLog(@"读取失败"); } else { // 处理消息 // 写回响应 char response[1024]; // 组装响应 // 写回 write(response, sizeof(response), new_clientFD); } // 关闭连接 close(new_clientFD);}
close(new_socketFD);
}
@end
TCP客户端(Client)
// Client.m
#import <Foundation/Foundation.h>
@interface TCPClient : NSObject
@end
@implementation TCPClient
(void)startClientWithHost:(NSString *)host andPort:(int)port {
// 创建socket
int socketFD = socket(AF_INET, SOCK_STREAM, 0);
if (socketFD == 0) {
return;
}
// 设置IP和端口
struct sockaddr_in target_addr;
target_addr.sin_addr = *(struct sockaddr *)host.UTF8String;
target_addr.sin_port = htons(port);
target_addr.sin_family = AF_INET;
// 绑定本地地址
if (bind(socketFD, &target_addr, sizeof(target_addr))) {
NSLog(@"绑定失败");
}
// 超时
int opt = 1;
if (setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
NSLog(@"setsockopt失败");
}
// 连接服务器
if (connect(socketFD, &target_addr, sizeof(target_addr))) {
NSLog(@"连接成功");
} else {
NSLog(@"连接失败");
}
// 读取服务器响应
char buffer[1024];
int read_size = read(socketFD, buffer, sizeof(buffer));
if (read_size == -1) {
NSLog(@"读取失败");
}
// 关闭socket
close(socketFD);
}
(void)sendMessage:(NSString *)message {
// 发送消息
char *msg = message.UTF8String;
int msg_length = strlen(msg);
int send_size = send(socketFD, msg, msg_length, 0);
if (send_size == -1) {
NSLog(@"发送失败");
}
}
@end
转载地址:http://eaifk.baihongyu.com/