基于TCP协议实现智能聊天机器人


前言

编写聊天程序的服务端代码和客户端代码。完成后,先启动服务端代码,然后启动客户端代码,服务端可以根据客户端发生的消息返回相应的答案。要求服务端代码具有一定的智能,能够根据不完整的问题识别客户端真正想问的问题。

一、socket是什么?

Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的。

二、使用步骤

1.服务端

代码如下(示例):

import socket
from os.path import commonprefix

words ={'人工':'有什么可以帮到你?',
'你叫什么名字?
  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现基于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”消息时,服务器会关闭连接,客户端也会退出聊天。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码姑娘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值