学习Java第二十一天(二):使用多线程+TCP实现简单聊天程序

1、使用多线程+TCP实现简单聊天程序

        能跑但是少注释!!!

public class ClientChat {
    public static void main(String[] args) throws IOException {
​
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入服务器ip:");
        String serverIp = reader.readLine();
        Socket client = new Socket(serverIp, 3000);
        boolean flag = true;
        OutputStream outputStream = client.getOutputStream();
        InputStream inputStream = client.getInputStream();
        String userName = "";
        //循环判断用户名是否重复
        while(flag) {
            System.out.println("请输入用户名:");
            userName = reader.readLine();
            String userNameInfo = "name-" + userName;
            outputStream.write(userNameInfo.getBytes());
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);
            String serverInfo = new String(bytes, 0, len);
            if (serverInfo.equals("yes")) {
                flag = false;
            }
        }
        System.out.println("欢迎" + userName + "进入聊天程序");
        System.out.println("[@所有人---【public-用户名-具体内容-时间】]");
        System.out.println("[@退出---【exit】]");
        ClientThread clientThread = new ClientThread(inputStream);
        clientThread.start();
​
        boolean flagIo = true;
        while(flagIo){
            String sendInfo = "";
            System.out.println("请输入内容");
            String context = reader.readLine();
            String[] split = context.split("-");
            if(split[0].equals("public")) {
                //public-用户名-具体内容-时间
                sendInfo = "public-" + userName + "-" + split[1] + "-" + getTime();
            }
            if(split[0].equals("exit")){
                sendInfo = "exit-" + userName + "-" + getTime();
            }
​
            outputStream.write(sendInfo.getBytes());
        }
        reader.close();
        inputStream.close();
        outputStream.close();
        client.close();
        clientThread.stop();
    }
    /**
     * 格式化时间
     * @return
     */
    private static String getTime() {
        return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss E").format(new Date());
    }
}
public class ClientThread extends Thread{
​
    private InputStream inputStream;
    public ClientThread(InputStream inputStream){
        this.inputStream= inputStream;
    }
    @Override
    public void run() {
        boolean flag = true;
        try {
            while(flag){
                byte[] bytes = new byte[1024];
                int len = inputStream.read(bytes);
                String s = new String(bytes, 0, len);
                System.out.println("接收的信息:" + s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
    }
}
public class ServerChat {
    public static void main(String[] args) throws IOException {
        Map<String,Socket> userList = new HashMap<>();
        ServerSocket serverSocket = new ServerSocket(3000);
        System.out.println("====服务器已经启动====");
        boolean flag = true;
        while(flag){
            Socket client = serverSocket.accept();
            ServerThread serverThread = new ServerThread(client, userList);
            serverThread.start();
        }
    }
}
public class ServerThread extends Thread {
    private Socket client;
    private Map<String,Socket> userList;
​
    public ServerThread(Socket client,Map<String,Socket> userList){
        this.client = client;
        this.userList = userList;
    }
​
    boolean flag = true;
    private String serverMs = "";
​
    @Override
    public void run() {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            inputStream = client.getInputStream();
            outputStream = client.getOutputStream();
            byte[] bytes = new byte[1024];
            while(flag){
                int len = inputStream.read(bytes);
                String result = new String(bytes, 0, len);
                String[] split = result.split("-");
                if(split[0].equals("name")){
                    System.out.println("用户名---" + split[1]);
                    if(userList.containsKey(split[1])){
                        serverMs = "no";
                    }else{
                        serverMs = "yes";
                        userList.put(split[1],client);
                    }
                    outputStream.write(serverMs.getBytes());
                }
​
                //public-用户名-具体内容-时间
                if(split[0].equals("public")){
                    serverMs = split[1] + "@所有人:" + split[2] + "  " + split[3];
                    Collection<Socket> socketList = userList.values();
                    for (Socket socket : socketList) {
                        OutputStream outputStream1 = socket.getOutputStream();
                        outputStream1.write(serverMs.getBytes());
​
                    }
                }
                //exit-用户名-时间
                if(split[0].equals("exit")){
                    serverMs = split[1] + "@所有人:已经离开" + split[2];
                    Collection<Socket> socketList = userList.values();
                    for (Socket socket : socketList) {
                        OutputStream outputStream1 = socket.getOutputStream();
                        outputStream1.write(serverMs.getBytes());
                    }
                    //删除map中的当前用户
                    userList.remove(split[1]);
                    flag = false;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try{
                this.client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网农民工001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值