设计思路
服务端
用一个数组来存放连接的客户端的sockid,一个COUNT来存放当前连接的客户端数量。服务端listen后一直处在accept状态,每接收到一个连接,就创建一个线程来完成与客户端的通信。当一个客户端发言时就遍历存放sockid的数组,向其它所有用户发送这条信息。
客户端
连接服务端后启动一个线程专门接收服务端返回的信息,主线程专门负责向服务端发送消息。
/*头文件*/
#ifndef _PUBLIC_H
#define _PUBLIC_H
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#endif
/*server.c*/
#include "public.h"
#include <signal.h>
#define PORT 8000
#define MAX 20
int sock_list[MAX], COUNT = 0;
pthread_mutex_t mutex_lock;
void sent(const int sockid,const char *name, const char *str)
{
printf("sending..\n");
for (int i = 0; i < COUNT; i++)
{
/* code */
if(sock_list[i] != sockid)
{
write(sock_list[i], name, sizeof(name));
sleep(0.5);
write(sock_list[i], str, sizeof(str));
//printf("%s %s\n", name, str);
}
}
}

本文介绍了一个在Linux环境下使用socket实现的多线程聊天室设计思路。服务端通过监听,接纳每个客户端连接并为其创建单独的通信线程。当有客户端发送消息时,服务端遍历所有连接,将消息广播给其他用户。客户端则分为接收和发送两个线程,分别负责接收服务端信息和向服务端发送消息。
最低0.47元/天 解锁文章
2210

被折叠的 条评论
为什么被折叠?



