项目介绍
项目概述
本系统是用户用过浏览器进入聊天系统。本系统主要功能是实现网上聊天,可以多个用户互相通信,需要用户注册属于自己的用户名该聊天系统包括浏览器和服务器两部分:首先,新用户必须通过注册获得一个自己的用户名,然后,用户才可以使用这个用户名登录进入聊天系统。该系统有一个聊天服务器,用于检查客户登录请求,转发用户所发出的消息,并负责删除退出的用户。浏览器部分主要实现登录到聊天服务器,向服务器发送各种请求和指定用户进行聊天等功能。聊天包括私聊和公聊,同时用户还可以修改自己的个人资料和登录密码,也可以增加和删除好友等。如果是管理员,则可以统计注册的用户名单、删除注册用户和修改用户权限。
需求分析
系统应满足如下业务需求:
客户端注册名字。
告诉所有的在线的客户端,XXX进入聊天室。
新建一个线程为该客户端服务,随时接收客户端发送来的内容。
当收到一个客户端的消息时,向每个客户端都转发一份(群聊)。
同时在线人数最多50人。
详细设计
功能描述——服务器端
信息处理:
服务器作为客户端之间发送消息的中转站,需要接受并转发客 户端之间的信息。
服务器也可以向指定的客户端发送系统信息,也可以向所有客 户端发送信息。
跟踪用户登录情况,并更新用户数量。
服务器设置:
服务器端设置服务器的IP地址和通信的端口号,便于客户端与服务器建立连接。
启动服务器准备进行信息中转与发送。
停止服务器服务,客户之间不能通信。
功能描述——客户端
信息处理:
接受服务器和其他客户端向本地发送的信息。
本地客户端向服务器和其他客户端发送信息。
客户端设置:
客户端需要连接服务器的IP地址和端口号。
启动客户端,根据服务器的IP地址和端口号登录到指定的服务器。
停止客户端,注销与服务器的连接,停止服务器的通信。
部分功能演示
用户登录功能演示
多人在线聊天功能
成员退出功能
部分代码展示
Sockaddr.h文件展示
#ifndef SOCKADDR_H
#define SOCKADDR_H
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
typedef struct sockaddr_in SA;
typedef struct sockaddr* SP;
#define PORT 11569
#define IP "127.0.0.1"
#endif//SOCKADDR_H
chat_client.c文件展示
#include "sockaddr.h"
static int sockfd;
void* recv_msg(void* arg){
char buf[1024] = {};
for(;;)
{
intret = recv(sockfd,buf,sizeof(buf),0);
if(0 >= ret)
{
printf("\r 服务器正在升级...\n");
_exit(0);
}
printf("\r%5s\n>>>",buf);
fflush(stdout);
}}
int main(){
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(0 > sockfd)
{
perror("socket");
return -1;
}
SA addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
intret = connect(sockfd,(SP)&addr,sizeof(addr));
if(0 > ret)
{
printf("服务器正在升级...\n");
return -1;
}
char buf[1024] = {};
printf("请输入用户名:");
gets(buf);
ret = send(sockfd,buf,strlen(buf)+1,0);
if(0 >= send)
{
printf("服务器正在升级...\n");
return -1;
}
pthread_t pth_id = 0;
ret = pthread_create(&pth_id,NULL,recv_msg,NULL);
if(0 > ret)
{
perror("pthread_exit");
return -1;
}
for(;;)
{
printf(">>>");
scanf("%s",buf);
printf("\33[1A%30s:me\n",buf);
ret = send(sockfd,buf,strlen(buf)+1,0);
if(0 >= send)
{
printf("服务器正在升级...\n");
return -1;
}
}
}
全部代码详见gitee:
<u>WUCHUANQI/简易聊天室 - Gitee.com</u>
收获总结
在这次实训中,我对c语言有了一个更深的了解认识,通过这次实训,也使我发现了许多问题,我认识到自己还有很多的知识没学好,基础知识没理清。
编写代码的过程中,一串代码的往往需要反复的测试,执行,才能完善,在编译报错的情况下,又需要反复的去检查。而也有可能在编译通过之后,执行后的结果并不是我预料和想要的结果。这就可能是代码中出了其他的错误,又需要反复的检查与改动。所以,这要求我在编写代码的过程中要更加的细心。