计算机网络课程设计改进

又到了期末考试周,最近一直忙着准备期末考试,博客好久没更新。

针对上次的计算机网络课程设计的聊天机器人,老师让我另实现一个功能———将聊天记录按时间顺序以文本文件保存下来,并且一天的聊天记录只能在一个文件下,重新运行不破坏之前的聊天记录。

关于时间的操作在#include<time.h>头文件里。

time_t timer = time(NULL);
char time1[100];
char a[10] = ".txt";
strcpy(time1, ctime(&timer));

这样time1[100]里保存的就是时间信息。首先我们要在一开始就是先以上代码,这样就可以创建以日期为名的文件。

这以有另一个问题,fopen("abc.txt","a+"),可以打开一个名为abc的文本文件

我们还可以定义一个数组,char   ch[10]="abc.txt",然后fopen(ch,"a+"),也可以打开名为abc的文本文件。

但是我们在time1数组前面加一个",在后面加一个.txt",是不能直接用这个数组名打开文件的。首先文件名是不能含有\,/,:,*,?,",<,>,|的,而time1数组里面一开始保存的时间信息就是Mon Jun 19 22:25:11 2017这样的,因为含有:,所以这样的操作不行,所以我们提取前面的Mon Jun 19赋给另一个数组即可。这样就以这一天的时间命名了一个文本文件。

char txt[20];
for (int i = 0; i < 11; i++)
{
txt[i] = time1[i];
}
txt[11] = '.';
txt[12] = 't';
txt[13] = 'x';
txt[14] = 't';
txt[15] = '\0';
FILE * fp = fopen(txt, "a");

另一个问题就是字符数组的结尾必须是\0,以表示字符串的结束。

剩下的操作就很简单了,每次服务端发送信息之前读取时间,保存时间到文件,发送信息之后,保存发送信息到文件。接收信息的时候也进行这种操作。以下是完整代码。只是修改了服务端的代码,客户端的代码并没有修改,详见上一篇博文。

#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include <stdio.h>  
#include <Winsock2.h> 
#include<stdlib.h>
#include<time.h>
#pragma comment(lib, "WS2_32")
typedef struct node {
char data[100];
struct node *next;
}*LinkList;
node *createlink()
{
node *head = (node*)malloc(sizeof(node));
char t[100];
node *p;
node *q;
p  = head;
FILE * r = fopen("input.txt", "r");
if (r == NULL)
{
printf("打开文件失败!");
return NULL;
}


while (fscanf(r, "%s", &t) != EOF)
{
q = (node*)malloc(sizeof(node));
strcpy(q->data, t);
p->next = q;
p = q;
}
p->next = NULL;
return head;
}


int main()
{
node *head;
head = createlink();
head = head->next;
WORD w;
WSADATA wsdata;
int err;
w = MAKEWORD(1, 1);
err = WSAStartup(w, &wsdata);
if (err!=0)
{
return -1;
}
if (LOBYTE(wsdata.wVersion)!=1||HIBYTE(wsdata.wVersion)!=1)
{
WSACleanup();
return -1;
}
SOCKET socket1 = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN address;
address.sin_addr.S_un.S_addr = htons(INADDR_ANY);
address.sin_family = AF_INET;
address.sin_port = htons(1000);
bind(socket1, (SOCKADDR*)&address, sizeof(SOCKADDR));
listen(socket1, 10);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
time_t timer = time(NULL);
char time1[100];
char a[10] = ".txt";
strcpy(time1, ctime(&timer));
char txt[20];
for (int i = 0; i < 11; i++)
{
txt[i] = time1[i];
}
txt[11] = '.';
txt[12] = 't';
txt[13] = 'x';
txt[14] = 't';
txt[15] = '\0';
FILE * fp = fopen(txt, "a");
while (true)
{
SOCKET sockConn = accept(socket1, (sockaddr*)&addrClient, &len);
char sendBuf[100]="欢迎来到聊天机器人\n";
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);


char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
printf("%s", recvBuf);
while (true)
{
char recvBuf[100];
char sin[10] = "结束对话";
if (strcmp(recvBuf,sin)==0)
{
return 0;
}
recv(sockConn, recvBuf, 100, 0);




time_t timer = time(NULL);
char time[100];
strcpy(time, ctime(&timer));
fprintf(fp, "%s", time);


char b[12] = "客户端问:";
fprintf(fp, "%s", b);
fprintf(fp, "%s\n", recvBuf);



printf("客户端说: %s\n",recvBuf);






node *aa = head;
char talk[100];
printf("你想说什么:");
while (strcmp(recvBuf, head->data)!=0&&head->next)
{
head=head->next;
}
if (!(head->next))
{
if (strcmp(recvBuf, sin) != 0)
{
char a[100] = "我不能理解";
send(sockConn, a, strlen(a) + 1, 0);
fprintf(fp, "%s", time);
char bb[12] = "服务端说:";
fprintf(fp, "%s", bb);
fprintf(fp, "%s\n", a);
}
}
else {
strcpy(talk, head->next->data);
send(sockConn, talk, strlen(talk) + 1, 0);
fprintf(fp, "%s", time);
char bb[12] = "服务端说:";
fprintf(fp, "%s", bb);
fprintf(fp, "%s\n", talk);
}
head = aa;
printf("\n");

}
closesocket(sockConn);
fclose(fp);
}
    return 0;
}

运行


然后工程文件下面就生成了Thu Jun 22文本文件,里面保存了聊天信息,因为我们是以追加的方式填充信息的,所以再次运行,上次的聊天记录并没有被破坏。






©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页