聊天室-服务端线程处理客户端信息

Posted czgxxwz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊天室-服务端线程处理客户端信息相关的知识,希望对你有一定的参考价值。

public class ServerThread extends  Thread {
    //需要处理的socket
    private Socket socket;
    //该线程对应的用户信息
    private User user;
    //新建读取信息缓存区
    public BufferedReader bufferedReader;
    //新建写入字符流
    public PrintWriter printWriter;

    //通过构造方法,初始化socket
    public ServerThread(Socket socket){
        this.socket=socket;
    }
    //该线程运行内容
    public void run(){

        try{
            //获得输入流,将数据载入缓存区
            bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //输出流,true为开启自动释放flush
            printWriter=new PrintWriter(socket.getOutputStream(),true);
            //欢迎词
            sentMessage(printWriter,"欢迎登入聊天室"+",当前在线用户个数:"+ServerSide.clinets.size());
            System.out.println("-----------------进入用户登录阶段-----------------");
            //进行登录操作
            user=Login(bufferedReader,printWriter);
            //登录成功之后,再加入到线程列表中
            ServerSide.clinets.add(this);
            System.out.println("-----------------进入用户信息转发阶段-----------------");
            //登录完成后,进入该用户信息转发阶段
            forwardMessage(bufferedReader,user);
            System.out.println("-----------------进入用户退出阶段-----------------");

            //sentMessage(printWriter,"退出成功!");
            bufferedReader.close();
            printWriter.close();
            this.socket.close();
            //从列表删除该线程
            ServerSide.clinets.remove(this);
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    /**
     * 信息转发阶段
     * @param bufferedReader
     * @return
     */
    public void forwardMessage(BufferedReader bufferedReader,User user){
        String clinetMessage=readMessage(bufferedReader);
        //Config.ExitCode为退出指令,为‘886’
        while (!Config.ExitCode.equals(clinetMessage)){
            for(int i=0;i<ServerSide.clinets.size();i++){
                ServerThread serverThread=ServerSide.clinets.get(i);
                //自身不需要发送数据
                if(serverThread!=this){
                    //获得对应的printWriter,发送短信
                    sentMessage(serverThread.printWriter,user.getName()+":"+clinetMessage);
                }
            }
            //等待下条数据
            clinetMessage=readMessage(bufferedReader);
        }
    }

    /**
     * 初始化登录环节
     * @param bufferedReader
     * @param printWriter
     * @return
     */
    public User Login(BufferedReader bufferedReader,PrintWriter printWriter){
        User user=new User();
        Boolean flag=false;
        while (!flag){
            sentMessage(printWriter,"请输入初始用户名:");
            String name=readMessage(bufferedReader);
            user.setName(name);
            sentMessage(printWriter,"请输入初始密码:");
            String psw=readMessage(bufferedReader);
            user.setPsw(psw);
            //校验账号密码
            flag=checkUser(user);
            //登录失败,返回结果
            if(!flag){
                sentMessage(printWriter,Config.LoginErrCode);
            }
        }
        //登录成功后,设置身份标示
        user.setId(UUID.randomUUID().toString());
        sentMessage(printWriter,Config.LoginSuccessCode);
        System.out.println(user.toString()+",登录成功!"+",当前在线用户个数:"+ServerSide.clinets.size());
        return user;
    }

    /**
     * 检查用户是否正确
     * 这里固定了两个用户
     * @param user
     * @return
     */
    public Boolean checkUser(User user){
        if(("admin".equals(user.getName())&&"123456".equals(user.getPsw()))||
                ("root".equals(user.getName())&&"123456".equals(user.getPsw()))||
                     ("czg".equals(user.getName())&&"123456".equals(user.getPsw()))){
            return true;
        }
        return false;
    }

    /**
     * 读取信息
     * @param bufferedReader
     */
    public String readMessage(BufferedReader bufferedReader) {
        String clinetMessage="";
        try {
            clinetMessage= bufferedReader.readLine();
            String username=(user==null?"未登录用户":user.getName());
            System.out.println(username+":"+clinetMessage);
        }catch (Exception e){
            e.printStackTrace();
        }
        return clinetMessage;
    }

    /**
     * 发送信息
     * @param printWriter
     * @param message
     */
    public void sentMessage(PrintWriter printWriter,String message){
        printWriter.println(message);
        printWriter.flush();
    }
}

  参考资料链接:https://blog.csdn.net/BlueSky_USC/article/details/54414860

public class ServerThread extends  Thread {
//需要处理的socket
private Socket socket;
//该线程对应的用户信息
private User user;
//新建读取信息缓存区
public BufferedReader bufferedReader;
//新建写入字符流
public PrintWriter printWriter;

//通过构造方法,初始化socket
public ServerThread(Socket socket){
this.socket=socket;
}
//该线程运行内容
public void run(){

try{
//获得输入流,将数据载入缓存区
bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//输出流,true为开启自动释放flush
printWriter=new PrintWriter(socket.getOutputStream(),true);
//欢迎词
sentMessage(printWriter,"欢迎登入聊天室"+",当前在线用户个数:"+ServerSide.clinets.size());
System.out.println("-----------------进入用户登录阶段-----------------");
//进行登录操作
user=Login(bufferedReader,printWriter);
//登录成功之后,再加入到线程列表中
ServerSide.clinets.add(this);
System.out.println("-----------------进入用户信息转发阶段-----------------");
//登录完成后,进入该用户信息转发阶段
forwardMessage(bufferedReader,user);
System.out.println("-----------------进入用户退出阶段-----------------");

//sentMessage(printWriter,"退出成功!");
bufferedReader.close();
printWriter.close();
this.socket.close();
//从列表删除该线程
ServerSide.clinets.remove(this);
}catch (Exception e){
e.printStackTrace();
}
}


/**
* 信息转发阶段
* @param bufferedReader
* @return
*/
public void forwardMessage(BufferedReader bufferedReader,User user){
String clinetMessage=readMessage(bufferedReader);
//Config.ExitCode为退出指令,为‘886’
while (!Config.ExitCode.equals(clinetMessage)){
for(int i=0;i<ServerSide.clinets.size();i++){
ServerThread serverThread=ServerSide.clinets.get(i);
//自身不需要发送数据
if(serverThread!=this){
//获得对应的printWriter,发送短信
sentMessage(serverThread.printWriter,user.getName()+":"+clinetMessage);
}
}
//等待下条数据
clinetMessage=readMessage(bufferedReader);
}
}

/**
* 初始化登录环节
* @param bufferedReader
* @param printWriter
* @return
*/
public User Login(BufferedReader bufferedReader,PrintWriter printWriter){
User user=new User();
Boolean flag=false;
while (!flag){
sentMessage(printWriter,"请输入初始用户名:");
String name=readMessage(bufferedReader);
user.setName(name);
sentMessage(printWriter,"请输入初始密码:");
String psw=readMessage(bufferedReader);
user.setPsw(psw);
//校验账号密码
flag=checkUser(user);
//登录失败,返回结果
if(!flag){
sentMessage(printWriter,Config.LoginErrCode);
}
}
//登录成功后,设置身份标示
user.setId(UUID.randomUUID().toString());
sentMessage(printWriter,Config.LoginSuccessCode);
System.out.println(user.toString()+",登录成功!"+",当前在线用户个数:"+ServerSide.clinets.size());
return user;
}

/**
* 检查用户是否正确
* 这里固定了两个用户
* @param user
* @return
*/
public Boolean checkUser(User user){
if(("admin".equals(user.getName())&&"123456".equals(user.getPsw()))||
("root".equals(user.getName())&&"123456".equals(user.getPsw()))||
("czg".equals(user.getName())&&"123456".equals(user.getPsw()))){
return true;
}
return false;
}

/**
* 读取信息
* @param bufferedReader
*/
public String readMessage(BufferedReader bufferedReader) {
String clinetMessage="";
try {
clinetMessage= bufferedReader.readLine();
String username=(user==null?"未登录用户":user.getName());
System.out.println(username+""+clinetMessage);
}catch (Exception e){
e.printStackTrace();
}
return clinetMessage;
}

/**
* 发送信息
* @param printWriter
* @param message
*/
public void sentMessage(PrintWriter printWriter,String message){
printWriter.println(message);
printWriter.flush();
}
}










































































































































以上是关于聊天室-服务端线程处理客户端信息的主要内容,如果未能解决你的问题,请参考以下文章

java多线程聊天,两个客户端通过服务端转发消息实现通信,可是为啥信息发不出去,?以下客户端和服务端

java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并

go语言实现聊天室

聊天室实现-服务端代码

java实现聊天室是怎么做到的?

java实现多客户聊天功能