该系统采用多线程方式实现不同主机之间的通信。
可实现多个用户间的通信以及可支持私聊模式。(输入用户名即可进入私聊模式,输入ALL返回群聊模式)
某一客户端退出并不影响其他客户的使用,所有用户全部退出,服务器关闭端口,结束进程。
服务器主线程程序框图
服务器接收连接线程程序框图(不完全,代码后续更新了,没改框图)
客户端主线程程序框图)
客户端消息接发线程程序框图
实验结果
服务器端代码:
#include#include #include #include #include #include #include #include #include #include #define PORT 8080 //1023~65535 #define MAX 100 #define IP "172.17.0.6" #define USER 20 //设置总的用户连接数 pthread_mutex_t mm;//发送数据的时候加锁,防止阻塞 typedef struct { char buf[100]; }userbuf;//读写缓存 typedef struct sockaddr_in SIN; SIN cli_addr[USER];// int cli_fd[USER];//客户端套接字 int tag=0;//群聊or私聊判断标志位 int count=0;//退出聊天用户数 int user=0;//实际用户数 int sockfd; typedef struct sockaddr SA; char siliao[20]="[PRIVATE]";//私聊信息附加显示 userbuf username[USER];//存储用户民信息 userbuf username_plus[USER];//给用户名增加冒号显示 userbuf recvbuf[USER];//服务器端接收缓存 userbuf sendbuf[USER];//服务器端发送缓 int length[USER]; int rank(char a[]) { int i; for(i=0;i 客户端代码:
#include#include #include #include #include #include #include #include #define IP "172.17.0.6" #define PORT 8080 #define MAX 100 int final=0; // 创建socket套接字文件,并连接 // 接受数据 client 客户端 typedef struct sockaddr_in SIN; typedef struct sockaddr SA; SIN ser_addr; int sockfd; void *message(void *arg) { printf("thread creat success!n"); char buf[100]; int signal; while(1) { if(final==1) break; memset(buf,0,100); signal=recv(sockfd,buf,MAX,0); if(signal!=0){ system("date"); write(1,buf,strlen(buf)); memset(buf,0,100);} } pthread_exit(NULL); } int main(int argc,char *argv[]) { //1、创建套接字文件,返回套接字文件描述符 socket() sockfd=socket(AF_INET, SOCK_STREAM, 0); pthread_t tid; if(sockfd == -1) { perror("socket create failurern"); return 0; } //2、创建结构,初始化数据 struct sockaddr 使用 struct sockaddr_in SIN ser_addr; ser_addr.sin_family = AF_INET;//选择ipv4协议族 ser_addr.sin_port=htons(PORT); //端口号要转换端绪,从小端绪转换从大端绪 ser_addr.sin_addr.s_addr=inet_addr(IP);//十进制的字符ip转换成网端数据格式 服务端IP int len=sizeof(ser_addr); if(connect(sockfd,(SA *)&ser_addr,len)==-1) { perror("connect failurern"); return 0; }else { printf("WELCOME TO DADONG TALK ROOM!rn"); printf("Please sign you name:"); char temp[20]={0}; memset(temp,0,100); scanf("%s",temp); send(sockfd,temp,strlen(temp),0);//发送信息 pthread_create(&tid,NULL,message,NULL); } char wbuf[100]={0}; while(1) { memset(wbuf,0,100); read(0,wbuf,100); if(strncmp(wbuf,"quit",4)==0) { send(sockfd,wbuf,strlen(wbuf),0); final=1; close(sockfd); return 0; } send(sockfd,wbuf,strlen(wbuf),MSG_NOSIGNAL); memset(wbuf,0,100); usleep(20); } close(sockfd); return 0; }



