TCP C/S 聊天室项目初篇

今天是项目开始的第二周了,写的比较慢,临近期末学校的考试,答辩比较多。目前基本实现了聊天室的功能,老师要求用select写,没办法不会用,先用线程来写,后面还会用UDP还有select在写一遍。今天整理了一下思路大致如下:1.客户端要登陆服务器才能执行各种功能,首先需要建立套接字,然后让服务器和客户端能连接起来。2.服务器这边我用的线程,主程序用来监听客户端的连接请求,线程
摘要由CSDN通过智能技术生成

今天是项目开始的第二周了,写的比较慢,临近期末学校的考试,答辩比较多。

目前基本实现了聊天室的功能,老师要求用select写,没办法不会用,先用线程来写,后面还会用UDP还有select在写一遍。

今天整理了一下思路大致如下:


1.客户端要登陆服务器才能执行各种功能,首先需要建立套接字,然后让服务器和客户端能连接起来。

2.服务器这边我用的线程,主程序用来监听客户端的连接请求,线程就用来处理连接之后的请求操作,这都比较简单。

3.客户端连接上之后可以向服务器发送操作请求。

具体子模块如下:


注册模块:

客户端这边的注册部分我这样处理的,注册还涉及不到其他客户端的互发消息,所以不需要开线程,要注意什么时候需要线程。

首先客户端这边需要给服务器发送消息告诉服务器你要注册了 可以设置结构体成员cmd = reg;然后依次输入注册信息,将整个结构体发送给服务器。

服务器这边接到信息读cmd 进入注册模块,将注册信息存入数据库,这里可以在user表中设置账号为主键,就不会出现账号重复了,数据库这边上课没听,百度时才知道。存好之后将存出结果返回给客户端,大体上可以这样返回:1数据库打开时出错,2.账号重复导致的出错。


登陆模块:

客户端这边就比较麻烦了,需要建线程,因为你登陆之后,一方面你需要给服务器发送操作请求另一方面你需要接受信息,服务器的信息或者其他客户端的消息。这是才需要建立线程。登陆,你肯定需要输入账号还有密码,将结构体发送给服务器。根据服务器发来的信息来执行操作。

服务器这边需要接受信息然后去log函数执行,将用户信息和数据库里面的信息作对比,对比结果发送给客户端。


登陆之后可以完成私聊,相对来说前面的程序没问题了,后面的私聊,群聊都不是很难,今天先写这么多。上传一下现在的程序,只是一个半成品,存在bug。

服务器部分:

/*****************************************************
    > File name: TcpNet.h
    > Author: Fang Wen Qian
    > 日期: 2017-12-20 00:17
*****************************************************/

#ifndef TCPNET_H_
#define TCPNET_H_

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <stdlib.h>
#include <sqlite3.h>                                                                      
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <netinet/in.h>

#define PORT                     8888

#define sqlexec_failure          -1         //数据库操作失败
#define sqlopen_failure          -2         //数据库打开失败
#define log_failure              -3         //登录失败
#define reg                       1         //注册
#define log                       2         //登录
#define reg_success               3         //注册成功
#define log_exist                 4         //在别出登录
#define common_user               5         //普通用户登录
#define Admin_user                6         //管理员登录
#define quit                      10        //退出聊天室回到登录界面
#define online                    7         //查看当前在线人数
#define gchat                     8         //群聊
#define pchat                     9         //私聊
#define confirm                   55         //确认文件传输对象
#define change                    66         //修改密码
#define deluser                   88         //注销
#define Accept                    9006      //用户接受文件
#define refuse                    9005      //用户不接受文件
#define choose                    9007      //处理文件传输
#define complete                  9008      //文件传输完成
#define silent                    9011      //处理禁言
#define delsilent                9012      //解除禁言
#define kick                      9013      //踢人
 
// 协议
struct Msg
{
    char msg[1024];         // 消息内容 (密码)
    int  cmd;               // 消息类型
    int  num;               // 在线人数
    int  state;             // 禁言
    char filename[50];      // 保存文件名
    char toname[20];        // 接收者姓名
    char fromname[20];      // 发送者姓名
    int  sig;               // 用户状态(0:管理员、1:普通用户、2:被禁言)
};

extern sqlite3 *ppdb;

int init_socket();
int MyAccept(int listen_sockfd);
void *MyRecv(void *arg);
void del_reg(int client_sockfd,struct Msg *msg);
void del_log(int client_sockfd,struct Msg *msg);
void user_do(int client_sockfd);
void del_online(int client_sockf
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
里面包含聊天室的客户端和服务器端的源文件和一份完整的设计报告。 一、 系统概要 本系统能实现基于VC++的网络聊天室系统。有单独的客户端、服务器端。 服务器应用程序能够接受来自客户端的广播,然后向客户端发送本机的IP与服务端口,让客户端接入到服务器进行聊天,检测用户名是否合法(重复),服务器责接收来自客户端的聊天信息,并根据用户的需求发送给指定的人或所有人,能够给出上线下线提示。客户端能够发出连接请求,能编辑发送信息,可以指定发给单人或所有人,能显示聊天人数,上线下线用户等。 二、 通信规范的制定 服务请求规范: 服务器端: (1) 创建一个UDP的套接字,接受来自客户端的广播请求,当请求报文内容为“REQUEST FOR IP ADDRESS AND SERVERPORT”时,接受请求,给客户端发送本服务器TCP聊天室的端口号。 (2) 创建一个主要的TCP协议的套接字负责客户端TCP连接 ,处理它的连接请求事件。 (3)在主要的TCP连接协议的套接字里面再创建TCP套接字保存到动态数组里,在主要的套接字接受请求后 ,就用这些套接字和客户端发送和接受数据。 客户端: (1) 当用户按“连接”按钮时,创建UDP协议套接字,给本地计算机发广播,广播内容为“REQUEST FOR IP ADDRESS AND SERVERPORT”。 (2)当收到服务器端的回应,收到服务器发来的端口号后,关闭UDP连接。根据服务器的IP地址和端口号重新创建TCP连接。 故我思考:客户端一定要知道服务器的一个端口,我假设它知道服务器UDP服务的端口,通过发广播给服务器的UDP服务套接字,然后等待该套接字发回服务器TCP聊天室服务的端口号,IP地址用ReceiveForom也苛刻得到。 通信规范 通信规范的制定主要跟老师给出的差不多,并做了一小点增加: (增加验证用户名是否与聊天室已有用户重复,在服务器给客户端的消息中,增加标志0) ① TCP/IP数据通信 --- “聊天”消息传输格式 客户机 - 服务器 (1)传输“用户名” STX+1+用户名+ETX (2) 悄悄话 STX+2+用户名+”,”+内容+ETX (3) 对所有人说 STX+3+内容+ETX 服务器- 客户机 (0)请求用户名与在线用户名重复 //改进 STX+0+用户名+EXT (1)首次传输在线用户名 STX+1+用户名+ETX (2)传输新到用户名 STX+2+用户名+ETX (3)传输离线用户名 STX+3+用户名+ETX (4)传输聊天数据 STX+4+内容+ETX (注:STX为CHR(2),ETX 为CHR(3)) 三、 主要模块的设计分析 四、 系统运行效果 (要求有屏幕截图) 五、 心得与体会

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值