聊天小專案之多客戶端聊天

2021-10-02 15:27:50 字數 4279 閱讀 9036

需求分析:能支援對個使用者同時聊天,實現群聊功能;

方法分析:採用多執行緒處理方式。不同的客戶端開啟不同的工作執行緒,共享同一程序的記憶體資訊。服務端**某一客戶端傳送的資訊給其他客戶端,實現資訊實時共享。

服務端**:

# server.c

#include #include #include #include #include #include #include #include #include #include #include #define maxline 1000 //在一條訊息中最大的輸出字元數

#define listenq 20 //最大監聽佇列

#define port 5000 //監聽埠

void *get_client(void *);

int sockfd,i;

static int maxi=0;//maxi表示當前client陣列中最大的使用者的i值

static int client[maxfd];

void recvandsend(void) //監聽**執行緒入口函式

pthread_exit(null);}

int main(int argc, char *ar**)

/* 伺服器端開始建立 socket 描述符 */

if((sockfd=socket(af_inet,sock_stream,0))==-1)

/* 伺服器端填充 sockaddr 結構 */

bzero(&server_addr,sizeof(struct sockaddr_in));

server_addr.sin_family=af_inet;

server_addr.sin_addr.s_addr=htonl(inaddr_any);

server_addr.sin_port=htons(port);

/* ** sockfd 描述符 */

if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

printf("伺服器監聽埠%d...\n",port);

/* 監聽 sockfd 描述符 */

if(listen(sockfd,listenq)==-1)

thr_id =pthread_create(&p_thread, null, recvandsend, null);

printf("歡迎來到本聊天室\n");

while(1)

sin_size=sizeof(struct sockaddr_in);

if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)

/*fprintf(stderr,"serverget connection from %s\n",inet_ntoa(client_addr.sin_addr));*/

client[maxi++]=new_fd;

printf("\n新使用者進入聊天室%d\n",new_fd);

}close(sockfd);

exit(0);

}

客戶端**:

#include #include #include #include #include #include #include #include #include #include #include #define true 1

#define port 5000

static int sockfd;

void* recvfromserver() //接受伺服器訊息執行緒入口函式

}pthread_exit(null);

return null;

}int main(int argc, char *ar**)

printf("請輸入伺服器ip位址\n");

scanf("%s",strhost);

if((host = gethostbyname(strhost)) == null)

/* 客戶程式開始建立 sockfd 描述符 */

printf("正在建立套介面...\n");

if((sockfd = socket(af_inet,sock_stream,0)) == -1)

/* 客戶程式填充服務端的資料 */

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=af_inet;

server_addr.sin_port=htons(port);

server_addr.sin_addr=*((struct in_addr *)host->h_addr);

printf("套介面建立成功,正在鏈結伺服器...\n");

/* 客戶程式發起連線請求 */

if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

/* 連線成功了 */

printf("請輸入你的使用者暱稱\n");

scanf("%s",clientname);

// write(sockfd,clientname,sizeof(clientname));

printf("\n\n開始聊天吧(\"quit\"斷開連線)\n\n");

thr_id = pthread_create(&p_thread, null, recvfromserver, null);

while(1)

if(strcmp(buffer,"quit")==0)

}/* 結束通訊 */

close(sockfd);

exit(0);

}

# client.c

#include #include #include #include #include #include #include #include #include #include #include #define true 1

#define port 5000

static int sockfd;

void* recvfromserver() //接受伺服器訊息執行緒入口函式

}pthread_exit(null);

return null;

}int main(int argc, char *ar**)

printf("請輸入伺服器ip位址\n");

scanf("%s",strhost);

if((host = gethostbyname(strhost)) == null)

/* 客戶程式開始建立 sockfd 描述符 */

printf("正在建立套介面...\n");

if((sockfd = socket(af_inet,sock_stream,0)) == -1)

/* 客戶程式填充服務端的資料 */

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=af_inet;

server_addr.sin_port=htons(port);

server_addr.sin_addr=*((struct in_addr *)host->h_addr);

printf("套介面建立成功,正在鏈結伺服器...\n");

/* 客戶程式發起連線請求 */

if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

/* 連線成功了 */

printf("請輸入你的使用者暱稱\n");

scanf("%s",clientname);

// write(sockfd,clientname,sizeof(clientname));

printf("\n\n開始聊天吧(\"quit\"斷開連線)\n\n");

thr_id = pthread_create(&p_thread, null, recvfromserver, null);

while(1)

if(strcmp(buffer,"quit")==0)

}/* 結束通訊 */

close(sockfd);

exit(0);

}

網路程式設計之多客戶端

1 reuseaddr 1 為了解決time wait狀態下不能馬上重啟程式的問題,所以伺服器要設定reuseadda屬性。使用setsockopt進行設定 2 setsockopt原型 int setsockopt int sockfd,int level,int optname,void opt...

聊天室客戶端

from socket import import os,sys 傳送訊息 def send msg s,name,addr while true text input 發言 if text quit msg q name s.sendto msg.encode addr sys.exit 退出聊天...

WinSock多人聊天客戶端

使用winsock 使用codeblocks編譯 只要需要執行兩個客戶端,客戶端傳送訊息給服務端,服務端收到訊息後 給其他客戶端 參考 include include include include include conio.h include include include include de...