Kuangcp/JavaBase

View on GitHub
network/src/main/java/com/github/kuangcp/bio/onechatone/ServerThread.java

Summary

Maintainability
B
5 hrs
Test Coverage
package com.github.kuangcp.bio.onechatone;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

/**
 * Created by Myth on 2017/4/3 0003
 */
@Slf4j
public class ServerThread extends Thread{
    private Socket socket;
    BufferedReader br = null;
    PrintStream ps = null;

    public ServerThread(Socket socket){
        this.socket = socket;
    }
    public void run(){
        try{
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            ps = new PrintStream(socket.getOutputStream());
            String line = null;
            while((line=br.readLine())!=null){
                //如果读到的行以标识符 USER_ROUND 开始的,并以这个结束,就可以确定读到的是用户登录的登录名
                if(line.startsWith(ChatProtocol.USER_ROUND) && line.endsWith(ChatProtocol.USER_ROUND)){
                    String userName = getRealMsg(line);
                    if(Server.clients.map.containsKey(userName)){
                        System.out.println("用户名重复");
                        ps.println(ChatProtocol.NAME_REP);
                    }else{
                        System.out.println("成功");
                        ps.println(ChatProtocol.LOGIN_SUCCESS);
                        Server.clients.put(userName,ps);
                    }
                //如果标记为私聊信息,私聊信息只向特定的输出流发送
                }else if(line.startsWith(ChatProtocol.PRIVATE_ROUND) && line.endsWith(ChatProtocol.PRIVATE_ROUND)){
                    String userAndMsg = getRealMsg(line);
                    //正则信息,分出用户,信息
                    String user = userAndMsg.split(ChatProtocol.SPLIT_SIGN)[0];
                    String msg = userAndMsg.split(ChatProtocol.SPLIT_SIGN)[1];
                    //获取私聊用户对应的输出流,发送私聊信息
                    Server.clients.map.get(user).println(Server.clients.getKeyByValue(ps)+"悄悄对你说 : "+msg);
                //公聊就对每个Socket发送
                }else{
                    //得到真实消息
                    String msg = getRealMsg(line);
                    //遍历所有输出流
                    for (PrintStream clientPs : Server.clients.valueSet()) {
                        clientPs.println(Server.clients.getKeyByValue(ps)+" 说 "+msg);
                    }

                }

            }
        //有异常说明 Socket对应的客户端出现了问题 就要删除它
        }catch (Exception e){
            Server.clients.removeByValue(ps);
            System.out.println(Server.clients.map.size());
            try{
                if(br!=null) br.close();
                if(ps!=null) ps.close();
                if(socket!=null) socket.close();
            }catch (Exception es){
                es.printStackTrace();
            }
            log.error("", e);
        }
    }

    //去除标识符,得到真实的信息
    private String getRealMsg(String line) {
        return line.substring(ChatProtocol.PROTOCOL_LEN,line.length()-ChatProtocol.PROTOCOL_LEN);
    }

}