本文共 3337 字,大约阅读时间需要 11 分钟。
在 Objective-C 中实现一个简单的 TCP 网络通信服务器和客户端,通常会选择使用底层的 BSD 套接字(sockets) API。这种方法在 macOS 平台上实现起来相对直接,特别适用于创建命令行工具。以下将详细介绍服务器端和客户端的实现步骤。
在开始编写代码之前,需要先完成一些前置工作:
安装 Xcode:确保你的 macOS 系统上已经安装了最新版本的 Xcode。如果尚未安装,可以通过苹果的开发者门户网站下载并安装。
创建项目:为服务器和客户端各创建一个独立的 “macOS Command Line Tool” 项目。在 Xcode 中,选择 File > New > Project…,然后选择 macOS 的 Command Line Tool 项目类型。
以下是服务器端的详细实现步骤:
创建服务器项目:
实现服务器逻辑:
#import#import #import #import int main(int argc, char **argv) { // 1. 创建 socket 描述符 int s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket failed"); return 1; } // 2. 绑定 socket 到本地 IP 和端口 struct sockaddr_in addr = {0}; addr.sin_family = AF_INET; addr.sin_port = htons(8080); addr.sin_addr = INADDR_ANY; if (bind(s, (socklen_t *)&addr, sizeof(addr)) == -1) { perror("bind failed"); return 1; } // 3. listen 客户端连接 int listen = 1; if (listen(s, listen) == -1) { perror("listen"); return 1; } // 4. 接受客户端连接 int new_socket; struct sockaddr_in from; socklen_t from_len = sizeof(from); if (accept(s, (socklen_t *)&from, &from_len) == -1) { perror("accept"); return 1; } new_socket = accept(s, (socklen_t *)&from, &from_len); // 5. 处理通信 while (true) { char buffer[1024]; int read_size = recv(new_socket, buffer, sizeof(buffer), 0); if (read_size == -1) { break; } printf("Server received: %s\n", buffer); char *response = "ACK"; send(new_socket, response, strlen(response), 0); printf("Server sent: %s\n", response); } // 6. 关闭 socket 描述符 close(new_socket); close(s); return 0;}
编译项目:
以下是客户端的详细实现步骤:
创建客户端项目:
实现客户端逻辑:
#import#import #import #import int main(int argc, char **argv) { // 1. 创建 socket 描述符 int s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket failed"); return 1; } // 2. 连接服务器 struct sockaddr_in addr = {0}; addr.sin_family = AF_INET; addr.sin_port = htons(8080); addr.sin_addr = INADDR_ANY; if (connect(s, (socklen_t *)&addr, sizeof(addr)) == -1) { perror("connect failed"); return 1; } // 3. 发送消息 char *message = "Hello, World!"; int message_len = strlen(message); send(s, message, message_len, 0); printf("Client sent: %s\n", message); // 4. 接收服务器响应 char buffer[1024]; int read_size = recv(s, buffer, sizeof(buffer), 0); if (read_size == -1) { printf("Connection closed by server\n"); return 1; } printf("Client received: %s\n", buffer); // 5. 关闭 socket 描述符 close(s); return 0;}
编译客户端项目:
通过以上步骤,我们成功实现了一个简单的 TCP 网络通信服务器和客户端。服务器端可以监听指定端口,接收客户端连接并进行消息交流;客户端则可以连接到服务器,发送消息并接收响应。这个实现基于 BSD 套接字 API,适合在 macOS 平台上创建命令行工具。
转载地址:http://akifk.baihongyu.com/