环境 服务端 Ubuntu18.04 LTS 客户端Qt Creator5.02 Kit:MinGW_32_bit
ip地址:初始设为127.0.0.1代表本机网卡的ip地址, 0.0.0.0代表任何Ip地址。
端口:初始设为8082
运行命令:
- ./Qt_server.out 启动服务端
- ls -l查看文件信息 客户端发送的文件默认存放在此文件夹下
client---->server
文本消息:“TEXTMSG ”
文件:文件名称
请求下载:"GETFILE "
server---->client
文本消息:“TEXTMSG ”
文件: 无
请求下载:"GETFILE "
-
创建服务器套接字--->设置地址复用--->绑定--->监听
-
创建epoll实例用来管理套接字
-
首先将服务器添加到epoll实例上
-
循环等待事件发生
while(1){ event_count = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); ..... for (int i = 0; i < event_count; i++) { if (events[i].data.fd == server_fd) { //处理新连接 accept... }else{ //处理已连接的数据 int bytes_read = read(client_fd, buffer, BUFFER_SIZE);//将数据读取到buffer中 if (bytes_read == 0) { //连接断开 }else if (bytes_read > 0){ if (strcmp(message_type, "TEXTMSG ") != 0 && strcmp(message_type, "GETFILE ") != 0){ //表示收到的消息是没有包头的文件 //在这里直接下载保存到服务器本地 } //循环遍历所有连接 读到数据包 for (int j = 0; j < client_count+1; j++) { if (client_fds[j] != 0 && client_fds[j] != client_fd && strcmp(message_type, "TEXTMSG ") == 0) { //处理文本消息 发送给除了发送端之外的所有客户端 }else if (client_fds[j] != 0 && client_fds[j] == client_fd && strcmp(message_type, "GETFILE ")==0){ //处理下载请求 发送给请求的客户端 }else if (client_fds[j] != 0 && strcmp(message_type, "TEXTMSG ") != 0 && strcmp(message_type, "GETFILE ") != 0){ //将文件名发送给所有客户端 } } } } } }
- 设计客户端的ui界面,具体展示效果图
- 创建套接字与服务端进行连接
- QListWidget显示提示及连接断开信息、QListView显示聊天室内已上传的文件目录。
- 头像设置为按钮,点击可进行头像选择。编辑框可输入名称。
- 输入ip、端口号进行连接。
- 客户端界面展示
- 多客户端间通信
- 头像选择(注:目前只能选择提供的头像否则可能无法识别)
- 下载文件