日期:2014-05-16 浏览次数:20775 次
实现目标
一个在Linux下可以使用的聊天软件,要求至少实现如下功能:
1. 采用Client/Server架构
2. Client A 登陆聊天服务器前,需要注册自己的ID和密码
3. 注册成功后,Client A 就可以通过自己的ID和密码登陆聊天服务器
4. 多个Client X 可以同时登陆聊天服务器之后,与其他用户进行通讯聊天
5. Client A成功登陆后可以查看当前聊天室内其他在线用户Client x
6. Client A可以选择发消息给某个特定的Client X,即”悄悄话”功能
7. Client A 可以选择发消息全部的在线用户,即”群发消息”功能
8. Client A 在退出时需要保存聊天记录
9. Server端维护一个所有登陆用户的聊天会的记录文件,以便备查
可以选择实现的附加功能:
1. Server可以内建一个特殊权限的账号admin,用于管理聊天室
2. Admin可以将某个Client X “提出聊天室”
3. Admin可以将某个Client X ”设为只能旁听,不能发言”
4. Client 端发言增加表情符号,可以设置某些自定义的特殊组合来表达感情.如输入:),则会自动发送”XXX向大家做了个笑脸”
5. Client段增加某些常用话语,可以对其中某些部分进行”姓名替换”,例如,输入/ClientA/welcome,则会自动发送”ClientA 大侠,欢迎你来到咱们的聊天室”
附加功能:
文件传输
部分主要代码:
客户端:
client_main.h
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <signal.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #include <errno.h> #include <pthread.h> #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h> #define PORT 6666 #define MAXLEN 1000 #define OK 1 #define FAULT 0 struct message /*消息结构体*/ { char flag[15]; /*标志位*/ char name[20]; /*用户名*/ char msg[MAXLEN]; /*消息内容*/ char addressee[20]; /*传输文件目的用户*/ int size; /*传输内容字节数*/ }; int qid = -1,fd = -1; int sockfd = -1; /*套接字描述符*/ int savefilefd = -1; /*保存文件描述符*/ char filefromname[20]; /*文件来源名*/ char chat_log[100]; /*聊天记录名*/ pthread_mutex_t lock ; /*线程锁*/
client_handle.h
#ifndef CLIENT_HANDLE_H #define CLIENT_HANDLE_H #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <signal.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #include <errno.h> #include <pthread.h> #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h> #define PORT 8888 #define MAXLEN 1000 #define OK 1 #define FAULT 0 struct message /*消息结构体*/ { char flag[15]; /*标志位*/ char name[20]; /*用户名*/ char msg[MAXLEN]; /*消息内容*/ char addressee[20]; /*传输文件目的用户*/ int size; /*传输内容字节数*/ }; extern int qid,fd; extern int sockfd; /*套接字描述符*/ extern int savefilefd; /*保存文件描述符*/ extern char filefromname[20]; /*文件来源名*/ extern char chat_log[100]; /*聊天记录名*/ extern pthread_mutex_t lock ; /*线程锁*/ char filefromuser[20]; /*文件发送者用户名*/ char locname[20]; /*本客户端用户名*/ int Interface(); void cutStr(char str[],char left[], int n, char right[],int m, char c); int help(char str[]); void expression(char name[],char msg[]); void common_use_words(char msg[]); void handlesendfile(); void handlerecvfile(struct message *msg); void handlerecvmsg(int *sockfd); int admin_kick(int sockfd,struct message *a); int admin_screen(int sockfd,struct message *a); int login_admin(struct message *a); int login_success(struct message *a); int Register(struct message *a); void log_user(struct message *a); #endif //CLIENT_HANDLE_H
my_system_call.h
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <signal.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #include <errno.h> #include <pthread.h> #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h>