• Java聊天小程序(多人)



    初学Java,用到网络编程和多线程的相关知识编辑了一套聊天程序,仅供参考,多多包涵:

    这是服务器
    package test;
    import javax.swing.*;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.CopyOnWriteArrayList;
    public class 服务器 {
        public static void main(String[] args) {
            服务器 ff = new 服务器();
            try {
                ff.WindowsChat();
            } catch (IOException e) {
            }
        }
        CopyOnWriteArrayList<Socket> socket = new CopyOnWriteArrayList<>();
        String a;int q;
        BufferedReader h;
        String c;
        Map<Socket,String>map=new HashMap<>();
        Map<Socket,String>color=new HashMap<>();
        public void WindowsChat() throws IOException {
            ServerSocket ss = new ServerSocket(Integer.parseInt(JOptionPane.showInputDialog(null, "请输入群聊密钥", "666")));
            String title;
            JFrame jf=new JFrame();
            new Thread().start();
            new Thread(() -> {
                Socket s;
                while (true) {
                    try {
                        s = ss.accept();
                        this.socket.add(s);
                        this.h=new BufferedReader(new InputStreamReader(s.getInputStream()));
                        String aaa= h.readLine();
                        String bbb=h.readLine();
                        var i = "#000000
    "+"(" + aaa+ ")连线 (" + socket.size() + "人)
    ";
                        map.put(s, aaa);
                        color.put(s, bbb);
                        for (Socket y : socket) {
                            try {
                                PrintWriter ll = new PrintWriter(y.getOutputStream());
                                ll.println(i);
                                ll.flush();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    } catch (IOException e) { e.printStackTrace(); } } }).start();
            while (true) {
                this.q = socket.size();
                for (Socket x : socket) {
                    new Thread(() -> {
                        while (true) {
                            try {
                                this.a = new BufferedReader(new InputStreamReader(x.getInputStream())).readLine() ;
                                socket.forEach(y -> {
                                    try {
                                        PrintWriter pp = new PrintWriter(y.getOutputStream());
                                        pp.println(color.get(x)+"
    "+a );
                                        pp.flush();
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                });
                            } catch (IOException e) {
                                socket.remove(x);
                                for (Socket y : socket) {
                                    try {
                                       PrintWriter ii  = new PrintWriter(y.getOutputStream());
                                       ii.println("#000000
    ("+map.get(x)+")下线 (" + socket.size() + "人)
    ");
                                        ii.flush();
                                    } catch (IOException ex) {
                                    }}
                                   // }
                                Thread.currentThread().stop();
                            } } }).start(); }
                while (true) {
                    if (socket.size() != q) break; } } }}
    

      

    先开启服务器,再开启用户端

    下面是用户端
    package test;
    
    import javax.swing.*;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.text.DefaultCaret;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Random;
    import java.util.Scanner;
    
    public class test22 extends JFrame implements KeyListener, ActionListener {
        public static void main(String[] args) {
            new test11().WindowsChat();
        }
        Socket s;
        String name;
        BufferedReader bf;
        String c;
        JTextField text = new JTextField();
        JButton search = new JButton("发送");
        JTextPane t = new JTextPane();
        Random rand = new Random();
        public void WindowsChat() {
            try {
                String a = JOptionPane.showInputDialog(this, "请输入对方ip", "192.168.3.209");
                String b = JOptionPane.showInputDialog(this, "请输入密钥", "666");
                this.s = new Socket(a, Integer.parseInt(b));
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, "错误", "提示", JOptionPane.ERROR_MESSAGE);
                return;
            }
            this.name = JOptionPane.showInputDialog(null, "登陆成功!请输入你的昵称", "傻狗" + rand.nextInt(100) + "号");
            Object[]colors={"red#FF0000","black#000000","blue#0000FF","purple#800080","green#008000","orange#FFA500","pink#FFC0CB","yellow#FFFF00"};
            this.c= JOptionPane.showInputDialog(null, "请输入你的字体颜色", "登陆成功!",-1,null, colors, colors[1]).toString();
            String cc=c.substring(c.lastIndexOf("#"));
            try {
                PrintWriter po = new PrintWriter(s.getOutputStream());
                po.println(name+"
    "+cc);
                po.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            setVisible(true);
            setTitle("聊天系统(" + name + ")");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            setSize(600, 750);
            setResizable(false);
            setLayout(null);
            text.setBounds(10, 10, 510, 80);
            search.setBounds(525, 10, 65, 80);
            t.setFont(new Font("楷体", Font.BOLD, 20));
            t.setBounds(10, 100, 570, 600);
            t.setFocusable(false);//DefaultCaret caret = (DefaultCaret)this.t.getCaret();
            // caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
            add(text);
            add(search);
            add(t);
            search.addActionListener(this);
            new Thread(() -> {
                while (true) {
                    try {this.bf=new BufferedReader(new InputStreamReader(s.getInputStream()));
                        String color=bf.readLine();
                        t.setForeground(Color.decode(color));
                        t.replaceSelection(bf.readLine() + "
    ");
                    } catch (IOException e) {
                        JOptionPane.showMessageDialog(null, "服务器断线!");
                        System.exit(0);
                    }
                }
            }).start();
            new Thread(() -> {
                text.addKeyListener(this);
            }).start();
        }
    
        @Override
        public void keyTyped(KeyEvent e) {
        }
    
        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER&&!text.getText().equals("")) {
                try {
                    PrintWriter pw = new PrintWriter(s.getOutputStream());
                    pw.println(name + ": " + text.getText() + "
    ");
                    pw.flush();
                    text.setText("");
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    
        @Override
        public void keyReleased(KeyEvent e) {
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            if (!text.getText().equals("")){
                try {
                    PrintWriter pw = new PrintWriter(s.getOutputStream());
                    pw.println(name + ": " + text.getText() + "
    ");
                    pw.flush();
                    text.setText("");
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }}
    }
    

      

    异国有风雪,天涯莫思君 分享一些学Java开发路上的疑难疑点,希望关注方便采纳
  • 相关阅读:
    有一天人人都会变成程序猿
    mysql 假设存在id则设数据自添加1 ,不存在则加入。java月份计算比較
    做程序员的老婆应该注意的一些事情
    人类科技的发展为什么会是加速度的(TRIZ方法再推荐)
    Unity5.0 RPG角色扮演历险类游戏之 森林历险记
    linux目录对照命令——meld
    iOS --- [持续更新中] iOS移动开发中的优质资源
    【spring bean】spring中bean的懒加载和depends-on属性设置
    【spring bean】 spring中bean之间的引用以及内部bean
    【spring set注入 注入集合】 使用set注入的方式注入List集合和Map集合/将一个bean注入另一个Bean
  • 原文地址:https://www.cnblogs.com/shuangfeike/p/11433737.html
Copyright © 2020-2023  润新知