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

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 {    //需要处理的socketprivate Socket socket;    //该线程对应的用户信息private User user;    //新建读取信息缓存区public BufferedReader bufferedReader;    //新建写入字符流public PrintWriter printWriter;

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

try{            //获得输入流,将数据载入缓存区bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));            //输出流,true为开启自动释放flushprintWriter=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://www.cnblogs.com/czgxxwz/p/10290899.html

时间: 2024-10-14 12:50:06

聊天室-服务端线程处理客户端信息的相关文章

服务端线程模型-NIO服务模型

上接<服务端线程模型-线程池服务模型>(https://www.cnblogs.com/fudashi233/p/10549221.html). 这篇分享从最初的单线程服务模型一直演进到线程池服务模型,充分发挥出了现在多核CPU机器的优势,但是当面对万级别的qps时,仍然可能因为线程池打满而拒绝掉大量请求. 比如可能有不少请求需要大量IO资源,导致IO阻塞的耗时较长,这就会导致其一直占用宝贵的线程池资源,导致后续的请求的响应时间长. 这时就需要使用NIO服务模型了,基于Selector的事件监

聊天室服务端的实现

该服务端是一个客户端连接进来新建一个线程,性能有待优化. socket服务端 public class MyServer { private int port; private ServerHandler serverHandler; public MyServer(int port,ServerHandler serverHandler) throws IOException{ System.out.println("初始化服务....."); this.setPort(port);

goland 简单聊天室服务端

package main import ( "fmt" "net" "strings" "time" ) type Client struct { C chan string //用于发送数据的管道 Name string //用户名 Address string //IP地址 } //保存在线用户 var onLineMap map[string]Client var message = make(chan string)

[Java聊天室服务器]实战之八 读写循环(客户端)

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之七 客户端类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)

Socket编程(简易聊天室客户端/服务器编写.CocoaAsyncSocket) 一.Socket 1.1 Socket简介 Socket就是为网络服务提供的一种机制.网络通信其实就是Socket间的通信,通信的两端都是Socket,数据在两个Socket间通过IO传输. 在Web服务大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此.而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销.Socket允许使用长连接,允许应用程序运

Python聊天室

1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx.time和thread这几个模块. 二.项目实战(服务器端) 1.服务器类 首先需要一个聊天服务器,这里继承asyncore的dispatcher类来实现,代码如下 class ChatServer(dispatcher): """ 聊天服务器 """ def _

使用Angular和Nodejs搭建聊天室

一,利用Node搭建静态服务器 这个是这个项目的底层支撑部分.用来支持静态资源文件像html, css, gif, jpg, png, javascript, json, plain text等等静态资源的访问.这里面是有一个mime类型的文件映射. mime.js /** * mime类型的 map * @ author Cheng Liufeng * @ date 2014/8/30 * 当请求静态服务器文件的类型 html, css, gif, jpg, png, javascript,

vue + socket.io实现一个简易聊天室

vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那么容易了.功能虽然不多,但还是有收获.设计和实现思路较为拙劣,恳请各位大大指正. 可以达到的需求 能查看在线用户列表 能发送和接受消息 使用到的框架和库 socket.io做为实时通讯基础 vuex/vue:客户端Ui层使用 Element-ui:客户端Ui组件 类文件关系图 服务端: 客户端: 服