C语言实现基于tcp协议的简易聊天机器人
时间: 2023-12-10 14:05:05 浏览: 172
实现基于TCP协议的简易聊天机器人需要进行以下步骤:
1. 创建服务器端和客户端程序。
2. 服务器端程序需要创建一个socket,绑定IP地址和端口号,并监听客户端连接请求。
3. 客户端程序需要创建一个socket,并连接服务器端。
4. 服务器端程序接受客户端的连接请求,并创建一个新的socket用于与客户端通信。
5. 客户端程序与服务器端建立连接后,可以向服务器发送消息,服务器接收到消息后进行处理并返回结果给客户端。
6. 服务器端程序需要实现简单的聊天机器人功能,可以根据客户端发送的消息,返回相应的回复消息。
下面是一个简单的基于TCP协议的聊天机器人示例程序:
服务器端代码(server.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAXLINE 1024
int main() {
int sockfd, newsockfd, n;
char buffer[MAXLINE];
struct sockaddr_in servaddr, cliaddr;
socklen_t len;
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(1);
}
// 初始化服务器地址结构体
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
// 绑定socket到IP地址和端口号
if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(1);
}
// 监听socket
if (listen(sockfd, 5) < 0) {
perror("listen failed");
exit(1);
}
printf("Server listening on port %d...\n", PORT);
while (1) {
// 接受客户端连接
len = sizeof(cliaddr);
newsockfd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);
if (newsockfd < 0) {
perror("accept failed");
exit(1);
}
printf("Connection accepted from %s:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
// 接收客户端消息
while (1) {
memset(buffer, 0, MAXLINE);
n = read(newsockfd, buffer, MAXLINE);
if (n < 0) {
perror("read failed");
exit(1);
} else if (n == 0) {
printf("Connection closed by client\n");
break;
}
printf("Received message: %s", buffer);
// 处理客户端消息并返回结果
if (strcmp(buffer, "hello\n") == 0) {
char *reply = "Hi, how can I help you?\n";
write(newsockfd, reply, strlen(reply));
} else if (strcmp(buffer, "bye\n") == 0) {
char *reply = "Goodbye!\n";
write(newsockfd, reply, strlen(reply));
printf("Connection closed by server\n");
break;
} else {
char *reply = "Sorry, I don't understand.\n";
write(newsockfd, reply, strlen(reply));
}
}
close(newsockfd);
}
close(sockfd);
return 0;
}
```
客户端代码(client.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAXLINE 1024
int main() {
int sockfd, n;
char buffer[MAXLINE];
struct sockaddr_in servaddr;
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(1);
}
// 初始化服务器地址结构体
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port = htons(PORT);
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("connection failed");
exit(1);
}
printf("Connected to server on port %d\n", PORT);
// 发送消息给服务器
while (1) {
printf("Enter message: ");
memset(buffer, 0, MAXLINE);
fgets(buffer, MAXLINE, stdin);
n = write(sockfd, buffer, strlen(buffer));
if (n < 0) {
perror("write failed");
exit(1);
}
// 接收服务器返回的消息
memset(buffer, 0, MAXLINE);
n = read(sockfd, buffer, MAXLINE);
if (n < 0) {
perror("read failed");
exit(1);
}
printf("Received message: %s", buffer);
// 判断是否退出聊天
if (strcmp(buffer, "Goodbye!\n") == 0) {
break;
}
}
close(sockfd);
return 0;
}
```
编译方式:
```bash
gcc server.c -o server
gcc client.c -o client
```
运行方式:
1. 启动服务器:`./server`
2. 启动客户端:`./client`
在客户端输入消息,按回车键发送消息给服务器,服务器会根据消息进行处理并返回相应的回复消息给客户端。当客户端发送“bye”消息时,服务器会关闭连接,客户端也会退出聊天。
阅读全文