1. 程式人生 > >聊天室-服務端線程處理客戶端信息

聊天室-服務端線程處理客戶端信息

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();
}
}

聊天室-服務端線程處理客戶端信息