聊天室-服务端线程处理客户端信息
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机制,重构线程,将单独的登录和注册线程合并