基于Linux的聊天室(客户端)初成版

实现注册、登入、下线、私聊、群聊、传文件、在线用户查询,以及管理员(root)的禁言,解禁,踢人等功能,与服务器进行连接。

 

/*****************************************************
copyright (C), Nanjing University of ZiJin
File name:client.c
Author: CaoMengDe  Version:0.1    Date: 2017-01-01 14:38
Description:
Funcion List: 
*****************************************************/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define PORTNUMBER 9997


void menu();//主菜单
int registration(int fd);//注册帐号
int signin(int fd);//登入帐号判断
void up(int fd);//上线
void *func(void* arg);//线程
int privatechat(int fd);//私聊
int groupchat(int fd);//群聊
void print(int fd);//显示当前在线用户
int Prohibition(int fd);//禁言
int Liftban(int fd);//解禁
int Kick(int fd);//踢人
void printlist(int fd);//管理员查看在线人数
int catban(int fd);//查看被禁言用户
int file(int fd);//文件传输


int privatechat_judge = 0;//判断是否禁言
int groupchat_judge = 0;
int down_judge = 0;//判断是否下线
int find_judge = 0;
int again_judge = 0;




int main()
{
//AF_INET:IPv4
//SOCK_STREAM:流式SOCKET,代表TCP
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == socket_fd)
{
perror("socket");
exit(1);
}

struct sockaddr_in client_addr;


    //清空addr
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(PORTNUMBER);
//将本机器上所有long数转化为网络字节许。
//UNADDR_ANY 可以接收任意IP地址
char argv[] = "127.0.0.1";
client_addr.sin_addr.s_addr = inet_addr(argv);

if (-1 == connect(socket_fd, (struct sockaddr *)(&client_addr), sizeof(struct sockaddr)))
{
perror("connect");
exit(2);
}
    while(1)
{

menu(socket_fd);
}
    return 0;
}


void *func(void* arg)
//线程
{
while(1)
{
char buffer[1024] = {0};
int socket_fd = (int)arg;
int ret = read(socket_fd, buffer, 1024);
if(-1 == ret)
{
perror("func");
exit(1);
}
if(strcmp(buffer, "privatechat_ok") == 0)
{
privatechat_judge = 1;
continue;
}
if(strcmp(buffer, "privatechat_error") == 0)
{
privatechat_judge = 2;
continue;
}
if(strcmp(buffer, "down_success") == 0)
{
down_judge = 1;
continue;
}
if(strcmp(buffer, "groupchat_success") == 0)
{
groupchat_judge = 1;
continue;
}
if(strcmp(buffer, "groupchat_error") == 0)
{
groupchat_judge = 2;
continue;
}
if(strcmp(buffer, "no_find") == 0)
{
find_judge = 1;
continue;
}
if(strcmp(buffer, "kick_success") == 0)
{
close(socket_fd);
printf("你已被管理员强制下线!!\n");
exit(1);


}

if(strcmp(buffer, "again_operate") == 0)
{
again_judge = 1;
continue;
}
if(strcmp(buffer, "file_accept") == 0)
{
char str[1024] = {0};
char tt[1024] = {0};
read(socket_fd, str, 1024);
int fd2 = open(str, O_CREAT|O_RDWR, S_IRWXU);
if(-1 == fd2)
{
perror("funcopen");
return;
}
while(ret = read(socket_fd, tt, 1024))
{
if(strcmp(tt, "end_file") == 0)
{
break;
}
write(fd2, tt, 1024);
memset(tt, 0, 1024);
}
printf("已收到发送的文件\n");
continue;
}

printf("%s\n", buffer);
}

}


void menu(int fd)
//主菜单
{
int ret;
char num[1024] = {0};
//system("clear");
printf("    *********************************************************************\n");
printf("    *                      欢迎来到Coder的聊天室                        *\n");
printf("    *                                                                   *\n");
printf("    *                      请输入您需要选择的功能:                     *\n");
printf("    *                                                                   *\n");
printf("    *                          1.注册帐号                               *\n");
    printf("    *                                                                   *\n");
printf("    *                          2.登入客户端                             *\n");
printf("    *                                                                   *\n");
printf("    *                          3.退出客户端                             *\n");
printf("    *********************************************************************\n");
scanf("%s", &num);
switch(num[0])
{
case '1':
{
char buffer1[1024] = "*registration";
write(fd, buffer1, 1024);
ret = registration(fd);
//注册帐号
if(ret == 0)
{
printf("\n");
printf("帐号注册成功!\n");

}
if(ret == -1)
{
   printf("\n");
       printf("帐号注册失败:用户名已存在!\n");
}
if(ret == 1)
{
printf("\n");
       printf("帐号注册失败:请输入相同的密码!\n");
}
   break;
}
case '2':
{
char buffer2[1024] = "*signin";
write(fd, buffer2, 1024);
ret = signin(fd);
//登入帐号
if(ret == 0)
{
printf("\n");
printf("帐号登入成功!\n");
char buffer3[1024] = "*up";
write(fd, buffer3, 1024);
up(fd);

}
if(ret == 1)
{
printf("\n");
printf("该用户名不存在!\n");

}
if(ret == -1)
{
printf("\n");
printf("密码错误!\n");

}
if(ret == 2)
{
char tt[1024] = "*superuser";
       write(fd, tt, 1024);
       superuser(fd);
}

break;
}

}    
if(num[0] == '3')
{
char buffer3[1024] = "*exit";
write(fd, buffer3, 1024);
exit(1);
}

}


int registration(int fd)
//注册帐号
{
char flag[1024] = {0};
char name[1024] = {0};
char pwd[1024] = {0};
char PWD[1024] = {0};
printf("请输入帐号:\n");
scanf("%s", name);
printf("请输入密码\n");
scanf("%s", pwd);
printf("请再次输入相同的密码\n");
scanf("%s", PWD);
write(fd, name, 1024);
write(fd, pwd, 1024);
write(fd, PWD, 1024);
read(fd, flag, 1024);
if(flag[0] == 'Y')
{
return 0;
}
if(flag[0] == 'N')
{
return -1;
}
if(flag[0] == 'A')
{
return 1;
}
}


int signin(int fd)
//登入帐号判断
{
char flag[1024];
char name[1024] = {0};
char pwd[1024] = {0};
printf("请输入帐号:\n");
scanf("%s", name);
printf("请输入密码\n");
scanf("%s", pwd);
write(fd, name, 1024);
write(fd, pwd, 1024);
read(fd, flag, 1024);
if(flag[0] == 'Y')
{
return 0;
}
if(flag[0] == 'N')
{
return -1;
}
if(flag[0] == 'Z')
{
return 1;
}
if(flag[0] == 'S')
{
return 2;
}
}


void up(int fd)
{
pthread_t pid;
pthread_create(&pid, NULL, (void*)func, (void*)fd);
char t[1024] = {0};
char s[1024] = {0};
/*char name[1024] = {0};
printf("请输入昵称:\n");
scanf("%s", name);
write(fd, name, 1024);*/
while(1)
{
/*if(judge == 1)
{
judge = 0;
break;
}*/

printf("\n");
printf("***************************1.私人聊天室************************\n");
printf("***************************2.群体聊天室************************\n");
printf("***************************3.显示当前在线用户******************\n");
printf("***************************4.发文件 ***************************\n");
printf("***************************5.下线******************************\n");
printf("\n");
printf("请输入你想选择的功能:\t");
printf("\n");
scanf("%s", t);
getchar();
switch(t[0])
{
case '1':
{
/*if(judge == 1)
{
printf("你已被管理员强制下线\n");
break;
}*/
char buffer1[1024] = "*privatechat";
write(fd, buffer1, 1024);
privatechat(fd);
break;
}
case '2':
{
/*if(judge == 1)
{
printf("你已被管理员强制下线\n");
break;
}*/
char buffer2[1024] = "*groupchat";
write(fd, buffer2, 1024);
groupchat(fd);
break;
}
case '3':
{
/*if(judge == 1)
{
printf("你已被管理员强制下线\n");
break;
}*/
char buffer3[1024] = "*print";
write(fd, buffer3, 1024);
print(fd);
sleep(1);
break;
}
case '4':
{
char buffer4[1024] = "*file";
write(fd, buffer4, 1024);
file(fd);
break;

}

}
if(t[0] == '5')
{
char buffer5[1024] = "*down";
write(fd, buffer5, 1024);
sleep(1);
if(down_judge == 1)
{
printf("下线成功\n");
down_judge = 0;
}
break;
}
memset(t, 0, 1024);

}
pthread_cancel(pid);
}
   



int privatechat(int fd)
{
sleep(1);
if(privatechat_judge == 1)
//禁言判断
{

char t[1024] = {0};
printf("输入你想聊天的对象昵称:\n");
scanf("%s", t);
write(fd, t, 1024);
memset(t, 0, 1024);
sleep(1);
if(find_judge == 1)
{
printf("该用户不在线\n");
find_judge = 0;
return 0;
}
printf("请输入你想发送的内容\n");
printf("友情提示:exit可终止私聊\n");
printf("\n");
while(1)
{
char buffer[1024] = {0};
scanf("%s", buffer);
write(fd, buffer, 1024);
if(strcmp("exit", buffer) == 0)
{
break;
}

}
privatechat_judge = 0;//置为初始

}
if(privatechat_judge == 2)
//禁言判断
{
printf("你已被管理员禁言\n");
printf("输入exit退出聊天\n");
while(1)
{
char n[1024] = {0};
scanf("%s", n);
if(strcmp(n, "exit") == 0)
{
break;
}
}
privatechat_judge = 0;

}

}


int groupchat(int fd)
{
sleep(1);
if(groupchat_judge == 1)
//禁言判断
{

char buffer[1024] = {0};
printf("请输入你想发送的内容\n");
printf("友情提示:exit可终止群聊\n");
printf("\n");
while(1)
{
scanf("%s", buffer);
write(fd, buffer, 1024);
if(strcmp("exit", buffer) == 0)
{
break;
}
memset(buffer, 0, 1024);
}
groupchat_judge = 0;

}
if(groupchat_judge == 2)
//禁言判断
{
printf("你已被管理员禁言\n");
printf("输入exit退出聊天\n");
while(1)
{
char n[1024] = {0};
scanf("%s", n);
if(strcmp(n, "exit") == 0)
{
break;
}
}
groupchat_judge = 0;
}
}


void print(int fd)
//在线用户查询
{
printf("在线用户查询列表:\n");
printf("\n");

}




void sumenu()
//管理员菜单
 {
printf("    *********************************************************************\n");
printf("    *                        尊敬的管理员 曹孟德                        *\n");
printf("    *                                                                   *\n");
printf("    *                      请输入您需要选择的功能:                     *\n");
printf("    *                                                                   *\n");
printf("    *                             1.禁言                                *\n");
printf("    *                             2.解禁                                *\n");
    printf("    *                             3.踢人                                *\n");
printf("    *                             4.查看在线用户                        *\n");
printf("    *                             5.查看被禁言用户                      *\n");
printf("    *                             6.私聊                                *\n");
printf("    *                             7.群聊                                *\n");
printf("    *                             0.下线                                *\n");
printf("    *********************************************************************\n");
 }
 
 
int superuser(int fd)
//管理员操作指令
{
pthread_t pid;
pthread_create(&pid, NULL, (void*)func, (void*)fd);
while(1)
{
sumenu();
int buffer;
scanf("%d", &buffer);
switch(buffer)
{
case 1:
{
char buffer1[1024] = "*Prohibition";
write(fd, buffer1, 1024);
Prohibition(fd);
break;
}
case 2:
{
char buffer2[1024] = "*Liftban";
write(fd, buffer2, 1024);
Liftban(fd);
break;
}
case 3:
{
char buffer3[1024] = "*Kick";
write(fd, buffer3, 1024);
Kick(fd);
break;
}
case 4:
{
char buffer4[1024] = "*print";
write(fd, buffer4, 1024);
printlist(fd);
sleep(1);
break;
}

case 5:
{
char buffer5[1024] = "*catban";
write(fd, buffer5, 1024);
catban(fd);
sleep(1);
break;
}
case 6:
{
char buffer6[1024] = "*privatechat";
write(fd, buffer6, 1024);
privatechat(fd);
break;
}
case 7:
{
char buffer7[1024] = "*groupchat";
write(fd, buffer7, 1024);
groupchat(fd);
break;
}


}
if(buffer == 0)
{
char buffer8[1024] = "*down";
write(fd, buffer8, 1024);
sleep(1);
if(down_judge == 1)
{
printf("管理员下线成功!\n");
down_judge = 0;
}
break;
}
}
pthread_cancel(pid);
}


int Prohibition(int fd)
//禁言
{
char buffer[1024] = {0};
printf("请输入你想禁言的对象昵称:\n");
scanf("%s", buffer);
write(fd, buffer, 1024);
sleep(1);
if(find_judge == 1)
{
printf("该用户不在线\n");
find_judge = 0;
return;
}
if(again_judge == 1)
{
printf("该用户已被禁言!\n");
again_judge = 0;
}
else
{
   printf("禁言成功!\n");
}
}


int Liftban(int fd)
//解除禁言
{
char buffer[1024] = {0};
printf("请输入你想解禁的对象昵称:\n");
scanf("%s", buffer);
write(fd, buffer, 1024);
sleep(1);
if(find_judge == 1)
{
printf("该用户不在线\n");
find_judge = 0;
return;
}
if(again_judge == 1)
{
printf("该用户没有被禁言\n");
again_judge = 0;
}
else
{
   printf("解禁成功!\n");
}
}


int Kick(int fd)
//踢人
{
char buffer[1024] = {0};
printf("请输入你想踢的对象昵称:\n");
scanf("%s", buffer);
write(fd, buffer, 1024);
sleep(1);
if(find_judge == 1)
{
printf("该用户不在线\n");
find_judge = 0;
return 0;
}
else
{
   printf("踢人成功!\n");
}


}


void printlist(int fd)
//在线用户查询
{
printf("在线用户查询列表:\n");
printf("\n");
}


int catban(int fd)
//被禁言用户查询
{
printf("被禁用户查询列表:\n");
printf("\n");


}


int file(int fd)
{
int ret;
char file1[1024] = {0};
char file2[1024] = {0};
char name[1024] = {0};
char buffer[1024] = {0};
printf("请输入你想要发送文件的对象:\n");
scanf("%s", name);
write(fd, name, 1024);
//sleep(1);
if(find_judge == 1)
{
printf("该用户不在线\n");
find_judge = 0;
return;
}
printf("请输入你想要发送的文件名:\n");
    scanf("%s", file1);
printf("请输入对方接受后的文件名:\n");
scanf("%s", file2);
write(fd, file2, 1024);
sleep(1);
int fd1 = open(file1, O_RDONLY);
if(-1 == fd1)
{
perror("open");
return;
}
while(ret = read(fd1, buffer, 1024))
{
if(-1 == ret)
{
break;
}
write(fd, buffer, 1024);
memset(buffer, 0 ,1024);
}
write(fd, "end_file", 1024);
close(fd1);
printf("发送成功!\n");

}




  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值