简易聊天程序教程(二)服务器的基本功能

源代码下载链接:http://download.csdn.net/detail/sky453589103/9514686

如果有什么问题,欢迎留言。

我设计的时候是先从服务器端开始设计的,服务器端先给出接口,然后客户端针对接口编程。

在说服务器的代码之前先说说数据库的设计吧。

数据的设计是简单的,只有两个表:

create database SimpleChat;
CREATE TABLE IF NOT EXISTS Account (
    username varchar(50) NOT NULL,
    userpassword varchar(20) NOT NULL,
    sex ENUM('male', 'female') NOT NULL,
    status ENUM('on', 'off', 'leave', 'busy') NOT NULL,
    constraint A_PK primary  key(username)
);

CREATE TABLE IF NOT EXISTS Friend(
    user_1 varchar(50) NOT NULL,
    user_2 varchar(50) NOT NULL,
    constraint F_PK primary key (user_1, user_2),
    constraint F_FK1 foreign key (user_1) references Account(username),
    constraint F_FK2 foreign key (user_2) references Account(username)
);

只有这两个表,表中的字段还不多。很方便学习。关于怎么用java连接数据库的,请看代码张的Main.java文件和SimpleChatServer.java中的SimpleChatServer类的构造函数。

在源代码中,服务器端的项目名称是SimpleChatServer,

服务器端功能模块包括下面几个:

1 注册模块;

2 登陆模块;

3 注销模块;

4 发送模块;

5 添加朋友模块;

6 删除朋友模块;

7 获取朋友列表模块;

8 输入检测模块;

上面这几个模块基本对应着一个函数,除了输入检测。输入检测只是简单的检测输入的用户名或者密码中有没空格,分号等字符,算是简单的拦截一下SQL注入吧。

值得注意的是,我在SimpleChatServer中设置了一个成员变量userBuf,这个变量用来存放的是已经登陆成功的用户已经对用的Socket,因为不可能每次需要查看一个用户是否登陆就要去查数据库,这样会影响效率。但这个做法也会有一个缺点,就是会增大程序需要的内存。

按惯例也是拿出一个函数来说一说就可以了。大部分的实现是还很相似的,只是细节不相同。下面就注册这个函数来说一下吧。

public ResponseMessage SignUp(String name, String password, Sex sex) {
        String sexValue = "";
        String statusValue = "off";

        if (Sex.MALE == sex) {
            sexValue = "male";
        } else if (Sex.FEMALE == sex) {
            sexValue = "female";
        }
        ResponseMessage response = new ResponseMessage(0, "Success");
        try {
            if (username.matches("[; ,]") || password.matches("[; ,]")) {
                response.setCode(1);
                response.setDescription("username or password has illigal charactor!");
                return response;
            }
            final String sql = "insert into Account values(\'" + name + "\', \'" + password + "\', \'" + sexValue
                    + "\', \'" + statusValue + "\');";
            Statement statement = conn.createStatement();
            statement.executeUpdate(sql);
        } catch (SQLException e) {
            response.setCode(1);
            response.setDescription(e.getMessage());
        }

        return response;
    }

需要重点关注的其实也就下面三句:

            final String sql = "insert into Account values(\'" + name + "\', \'" + password + "\', \'" + sexValue
                    + "\', \'" + statusValue + "\');";
            Statement statement = conn.createStatement();
            statement.executeUpdate(sql);

第一条语句是设定一条数据库的语法。

第二条是在已有的数据连接上创建一个Statement,通过Statement来执行sql语句。

第三条语句是执行sql语句,因为是insert,所有执行的是executeUpdate方法。如果想要查看类似select语句的例子,那请看获取朋友列表的函数。

最后要说明的是,Server提供了添加在线用户的接口和删除在线用户的接口。

	public void AddUser(String name, Socket s) {
		userBuf.put(name, s);
	}

	public void RemoveUser(String name) {
		userBuf.remove(name);
	}

其实这两个函数只是吧userBuf中的响应的键值对给删除了。不会访问数据库。写这两个方法的原因是为了以后如果要改变userBuf的表现形式,可以不用改变客户端的代码。

时间: 2024-08-30 10:01:06

简易聊天程序教程(二)服务器的基本功能的相关文章

简易聊天程序教程(一)自定义异常和消息格式

源代码下载链接:http://download.csdn.net/detail/sky453589103/9514686 如果有什么问题,欢迎留言. 自定义异常的目的是为了更好的表示出错的原因,能够针对不同的异常执行不同的处理. 异常的自定义是简单的,只是简单的继承了Exception类.下面给出所有聊天程序的异常类的基类的ChatException的定义: package SimpleChat; public class ChatException extends Exception{ /**

简易聊天程序教程(三)服务器的多线程

源代码下载链接:http://download.csdn.net/detail/sky453589103/9514686 如果有什么问题,欢迎留言. 如果一个服务器只能为两个用户提供服务器,那就真的是太渣了.很多时候,聊天的客户都会大于两个.因此需要提高并发量. 在Java中使用多线程还是很方便的.我在这个服务器程序使用的是实现Runnable接口的方法来定义自己的多线程操作.通过重写run方法,来实现自己的多线程操作. 每个线程都会有一个client成员变量,这个成员变量用来记录客户端的Soc

简易聊天程序教程(四)客户端基本功能

源代码下载链接:http://download.csdn.net/detail/sky453589103/9514686 如果有什么问题,欢迎留言. 客户端的基本功能是根据服务器给出的接口逐步来实现的.客户端的设计流程是清晰的.简化的思考流程如下图所示: 当然,实现的时候就要考虑比较多的细节,比如在注册的时候,注册失败怎么办,登陆的时候,账号密码不匹配怎么办.但总的流程就是这样子的. 从上面的流程可以看出了,客户端的窗口模块分下面几个(附上动作的解析): 1 登陆窗口模块: 登陆窗口需要提供两个

简易聊天程序教程(五)客户端的登陆和注册窗口

源代码下载链接:http://download.csdn.net/detail/sky453589103/9514686 如果有什么问题,欢迎留言. 其实大家也能想到,登陆和注册窗口其实很相似的,而注册窗口总是比登陆窗口多一些内容. 先来说说登陆窗口.登陆窗口的界面如下图: 登陆窗口继承字Dialog类,而不是继承自JFrame类.登陆窗口显示在屏幕中间,通过下面的方法就可以达到效果: setLocationRelativeTo(null); 在构造函数中调用这个方法,就能显示在屏幕中央,如果参

简易聊天程序教程(六)主窗口和聊天窗口

源代码下载链接:http://download.csdn.net/detail/sky453589103/9514686 如果有什么问题,欢迎留言. 主窗口用的是JList控件,在显示了登陆的跟人信息之后,接下来就是好友的列表. 为了方便以后拓展 ,我把好友的信息封装在FriendInformation中,FriendInformation类的定义也很简单的,都能看懂. 下面来逐步分析一下MainWin类: MainWin中比较重要的是事件的监听: 好友列表中的右键菜单的监听: JMenuIte

基于C# Winform的简易聊天程序[第一篇-两端通信]

程序简介 本聊天程序支持局域网内部客户端与服务端之间的互相通信. 原理 启动服务端后,服务端通过持续监听客户端发来的请求,一旦监听到客户端传来的信息后,两端便可以互发信息了.服务端需要绑定一个IP,用于客户端在网络中寻找并建立连接.信息发送原理:将手动输入字符串信息转换成机器可以识别的字节数组,然后调用套接字的Send()方法将字节数组发送出去.信息接收原理:调用套接字的Receive()方法,获取对端传来的字节数组,然后将其转换成人可以读懂的字符串信息. 界面设计 - 服务端 IP文本框 na

PHP制作简易聊天程序

近几天来,突然在查阅PHP中文手册时,看到了用PHP制作聊天室的示例,于是一时心血来潮也用PHP写了一个简易的WEB聊天室应用,在写聊天室的过程中,我遇到的问题其实不算很多,因为用php制作聊天室的原理是非常简单的,也许这与我自身思考问题的方式有关,我往往喜欢把任何看似复杂的东西简单化,我相信表面复杂的事物,其实都蕴含着简易原理,我的这种思维模式在这次WEB聊天应用的制作中起到了作用,下面我就将PHP制作WEB聊天室的原理给大家做一个介绍: 首先我们要建立一个WEB框架,这个框架也就是利用HTM

Socket封装之聊天程序(二)

今天,学习一下socket的封装. 类图 ??首先,我们把需要封装的各个类初步的设计如下: ??接下来,我们建立类与类之间的关系:??其中,CStream类可有可无,这个类是用来封装各种读写流的. socket封装 stream类 stream.h: class CStream { public: CStream(int fd = -1); ~CStream(); void SetFd(int fd); int GetFd(); int Read(char *buf, int count); /

.Net学习笔记----2015-07-06(简易聊天程序)

直接上代码,注释俺写了不少,留着参考 服务端: 1 namespace sever 2 { 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 11 { 12 13 } 14 15 16 private void bt