1、 先运行server.c的代码,可以在服务器中查看已经注册的账户信息。
2、 接着运行client.c代码,运行后有注册、登陆和退出功能。注册是注册账号;登陆是登陆账号;退出是退出客户端。
3、 登陆之后有四个功能,分别是显示在线好友、和好友聊天、群聊和退出账号。点击和好友聊天后,出现输入好友姓名(好友必须在线),然后可以发消息给对方。当输入”exit”时可退出聊天,返回上一级。点击群聊后,直接输入想发送的消息,可发给所有在线用户。
server.c:
#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#definePORT 10000
staticchar *errmsg = NULL;
staticchar **Result = NULL;
staticsqlite3_stmt *stmt = NULL;
sqlite3*db = NULL;
int fd_client[20] = {0}; //存储socket套接字
void Sendtoall(char msg[],int sockfd); //msg是要发的信息
void up_down_line(int fd,char msg[]); //fd是客户端的socket
//创建数据库和两个表,一个存放用户信息(register),一个在线信息(online)。
voidCreateDb()
{
int rc;
rc =sqlite3_open("chattingroom.db",&db);
rc = sqlite3_exec(db,"create tableregister(name,code)",0,0,&errmsg);
rc = sqlite3_exec(db,"create tablechat(msg)",0,0,&errmsg);
rc = sqlite3_exec(db,"create tableonline(fd integer,name)",0,0,&errmsg);
if(rc != 0)
{
printf("create db error!\n");
exit(1);
}
}
//显示已注册的帐号
voidAccountNumber()
{
int rc;
int i,j,nrow,ncolumn;
rc =sqlite3_open("chattingroom.db",&db);
rc = sqlite3_get_table(db,"select*from register",&Result,&nrow,&ncolumn,&errmsg);
if(rc != 0)
{
printf("display error!\n");
exit(1);
}
else
{
for(i = 1; i <= nrow; i++)
{
for(j = 0; j < ncolumn ;j++)
{
printf("%s|",Result[i*ncolumn + j]);
}
printf("\n");
}
}
sqlite3_free_table(Result);
sqlite3_close(db);
}
//清空数据库中表online(在线人信息)
voidonline_clear()
{
int rc;
rc =sqlite3_open("chattingroom.db",&db);
if(rc != 0)
{
printf("open db error!\n");
exit(1);
}
rc = sqlite3_exec(db,"delete fromonline",0,0,&errmsg);
if(rc != 0)
{
printf("delete onlineerror!\n");
exit(1);
}
sqlite3_close(db);
}
//读出客户端要连的id,并读出信息发给它
void *read_msg(void *arg)
{
char buf[100]; //接受客户端发来的内容,包括指令
//char down_msg[50]; //存储下线信息
int sockfd = *((int*)arg); //客户端的ID
int new_sockfd; //新客户端ID
int types_read = 0;
int i,flag = 1;
char up_msg[] = "is on line!";
char down_msg[] = "is on offline!";
up_down_line(sockfd,up_msg); //发送上线通知
while(1 == flag)
{
read(sockfd,buf,sizeof(buf)); //读客户端登录上去后的指令
if(strcmp(buf,"0") == 0)
{ </