聊天室-服務端線程處理客戶端信息
阿新 • • 發佈:2019-01-19
pub csdn puts random roo true ole 通過 buffered
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();
}
}
聊天室-服務端線程處理客戶端信息