最近几天写了这个聊天室。一开始写的有点混乱,也有一些地方待改进。
实现功能:
1、注册用户:
当服务器解析到客户端传过来的命令是“注册”时,生成一个随机数作为账号,和用户名,密码插入到数据库中的注册列表中。
2、用户登录:
当服务器解析到客户端传过来的命令是“登录”时,到数据库中的注册列表中查找用户id和密码是否吻合;如果吻合,则创建一个结点保存用户的信息,插入到“在线链表”中。此外,到数据库中的离线消息列表中查看是否有“离线消息”,如果有直接打印。
3、私聊:
当服务器解析到客户端传过来的命令是“私聊”时,会首先判断此客户端是否被禁言,如果被禁言则没有发言权限,如果没有被禁言,则服务器会遍历“在线链表”,找到接收客户端。
4、群聊:
此用户没有被禁言,可以给除自己外,所有在线用户一次发送消息。
5、查看在线好友:
遍历在线链表
6、修改密码:
7、管理员的权限:
禁言(被禁言可以接收消息)、解禁、踢人(就是将用户从在线链表中删除)。
8、发送离线消息:
保存到数据库中的离线消息列表中。
部分代码如下:
client.c
#include "myhead.h"
int flag = 0;
int log_2_flag = 0;
int admin = 0;
void *read_msg(void *argc);
int main(int argc, char **argv)
{
//参数入口检查;
if(argc != 2)
{
perror("argc");
return -1;
}
int socketfd = 0;
int ret = 0;
struct sockaddr_in sock_server = {
0};
socketfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == socketfd)
{
perror("socket");
return -1;
}
printf("socket success...\n");
//用sock_server提醒你们这边连接的是服务器端的IP地址和端口号;
sock_server.sin_family = AF_INET;
sock_server.sin_port = htons(MYPORT);
//sock_server.sin_addr.s_addr = inet_addr(MYADDR);
sock_server.sin_addr.s_addr = inet_addr(argv[1]);
ret = connect(socketfd,(struct sockaddr *)&sock_server,sizeof(struct sockaddr));
if(ret == -1)
{
perror("connect");
return -1;
}
printf("connect success...\n");
int sendcnt = 0;
int recvcnt = 0;
//char sendbuff[20] = {0};
struct message Msg = {
0};
pthread_t th = 0;
if (pthread_create(&th, NULL, read_msg, &socketfd) != 0)
{
perror("Client: pthread_create");
return -1;
}
while(1)
{
bzero(&Msg, sizeof(Msg));
Interface_1();
scanf("%d", &Msg.action1);
if(3 == Msg.action1)
{
break;
}
switch(Msg.action1)
{
case 1:
Log(&Msg);
sendcnt = write(socketfd, &Msg, sizeof(struct message));
if (-1 == sendcnt)
{
perror("send");
return -1;
}
sleep(1);
while(1 == flag)
{
bzero(&Msg, sizeof(Msg));
if(0 == flag)
{
break;
}
sleep(1);
Interface_2();
scanf("%d", &Msg.action2);
if(0 == flag)
{
break;
}
switch(Msg.action2)
{
case 1:
printf("在线好友:\n");
sendcnt = write(socketfd, &Msg, sizeof(struct message));
if (-1 == sendcnt)
{
perror("send");
return -1;
}
break;
case 2:
printf("请选择你想要私聊的对象:\n");
scanf("%d", &Msg.toid);
printf("请输入你想要对%d说的话:\n", Msg.toid);
scanf("%s", Msg.information);
sendcnt = write(socketfd, &Msg, sizeof(struct message));
if (-1 == sendcnt)
{
perror("send");
return -1;
}
break;
case 3:
printf("请输入你想对大家说的话:\n");
scanf("%s", Msg.information);
sendcnt = write(socketfd, &Msg, sizeof(struct message));
if (-1 == sendcnt)
{
perror("send");
return -1;
}
break;
case 4:
Log_2(&Msg);
sendcnt = write(socketfd, &Msg, sizeof(struct message));
if (-1 == sendcnt)
{
perror("send");
return -1;
}
sleep(1);
if(1 == log_2_flag)
{
printf("账号,密码正确!\n");
Alter_psw(&Msg);
sendcnt = write(socketfd, &Msg, sizeof(struct message));
if (-1 == sendcnt)
{
perror("send");
return -1;
}
printf("密码修改成功,请重新登录!\n");
break;
}
printf("账号,密码有误!\n");
flag = 0;
case 5:
printf("请输入管理员密码:\n");
scanf("%s", Msg.buff);