Java+Swing聊天室

一、系统介绍

本系统实现了简单的聊天室功能:发送消息、清屏、退出系统。

二、系统展示

1.发送消息

在这里插入图片描述

2.清屏

在这里插入图片描述

三、系统实现

Client.java

package cn.talk;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import java.nio.charset.*;
import java.text.*;
 
public class Client
{
    //建立客户端Socket
    static Socket s = null;
    //消息接收者uid
    static StringBuilder uidReceiver = null;
 
    public static void main(String[] args)
    {
        //创建客户端窗口对象
        ClientFrame cframe = new ClientFrame();
        //窗口关闭键无效,必须通过退出键退出客户端以便善后
        cframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        //获取本机屏幕横向分辨率
        int w = Toolkit.getDefaultToolkit().getScreenSize().width;
        //获取本机屏幕纵向分辨率
        int h = Toolkit.getDefaultToolkit().getScreenSize().height;
        //将窗口置中
        cframe.setLocation((w - cframe.WIDTH)/2, (h - cframe.HEIGHT)/2);
        //设置客户端窗口为可见
        cframe.setVisible(true);
        
        try
        {
            //连接服务器
            s = new Socket(InetAddress.getLocalHost(), 10086);
            //获取输入流
            InputStream in = s.getInputStream();
            //获取输出流
            OutputStream out = s.getOutputStream();
 
            //获取服务端欢迎信息
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            //将欢迎信息打印在聊天消息框内
            cframe.jtaChat.append(new String(buf, 0, len));
            cframe.jtaChat.append("\n");
 
            //持续等待接收服务器信息直至退出
            while(true)
            {
                in = s.getInputStream();
                len = in.read(buf);
                System.out.println(len);
                //处理服务器传来的消息
                String msg = new String(buf, 0, len);
                //消息类型:更新在线名单或者聊天
                String type = msg.substring(0, msg.indexOf("/"));
                //消息本体:更新后的名单或者聊天内容
                String content = msg.substring(msg.indexOf("/") + 1);
                //根据消息类型分别处理
                //更新在线名单
                if(type.equals("OnlineListUpdate"))
                {
                    //提取在线列表的数据模型
                    DefaultTableModel tbm = (DefaultTableModel) cframe.jtbOnline.getModel();
                    //清除在线名单列表
                    tbm.setRowCount(0);
                    //更新在线名单
                    String[] onlinelist = content.split(",");
                    //逐一添加当前在线者
                    for(String member : onlinelist)
                    {
                        String[] tmp = new String[3];
                        //如果是自己则不在名单中显示
                        if(member.equals(InetAddress.getLocalHost().getHostAddress() + ":" + s.getLocalPort()))
                            continue;
                        tmp[0] = "";
                        tmp[1] = member.substring(0, member.indexOf(":"));
                        tmp[2] = member.substring(member.indexOf(":") + 1);
                        //添加当前在线者之一
                        tbm.addRow(tmp);
                    }
                    //提取在线列表的渲染模型
                    DefaultTableCellRenderer tbr = new DefaultTableCellRenderer();
                    //表格数据居中显示
                    tbr.setHorizontalAlignment(JLabel.CENTER);
                    cframe.jtbOnline.setDefaultRenderer(Object.class, tbr);
                }
                //聊天
                else if(type.equals("Chat"))
                {
                    String sender = content.substring(0, content.indexOf("/"));
                    String word = content.substring(content.indexOf("/") + 1);
                    //在聊天窗打印聊天信息
                    cframe.jtaChat.append(cframe.sdf.format(new Date()) + "\n来自 " + sender + ":\n" + word + "\n\n");
                    //显示最新消息
                    cframe.jtaChat.setCaretPosition(cframe.jtaChat.getDocument().getLength());
                }
            }
        }
        catch(Exception e)
        {
            cframe.jtaChat.append("服务器挂了.....\n");
            e.printStackTrace();
        }
    }
}
 
//客户端窗口
class ClientFrame extends JFrame
{
    //时间显示格式
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 
    //窗口宽度
    final int WIDTH = 700;
    //窗口高度
    final int HEIGHT = 700;
    
    //创建发送按钮
    JButton btnSend = new JButton("发送");
    //创建清除按钮
    JButton btnClear = new JButton("清屏");
    //创建退出按钮
    JButton btnExit = new JButton("退出");
 
    //创建消息接收者标签
    JLabel lblReceiver = new JLabel("对谁说?");
 
    //创建文本输入框, 参数分别为行数和列数
    JTextArea jtaSay = new JTextArea();
 
    //创建聊天消息框
    JTextArea jtaChat = new JTextArea();
 
    //当前在线列表的列标题
    String[] colTitles = {"网名", "IP", "端口"};
    //当前在线列表的数据
    String[][] rowData = null;
    //创建当前在线列表
    JTable jtbOnline = new JTable
                                (
                                    new DefaultTableModel(rowData, colTitles)
                                    {
                                        //表格不可编辑,只可显示
                                        @Override
                                        public boolean isCellEditable(int row, int column)
                                        {
                                            return false;
                                        }
                                    }
                                );
    
    //创建聊天消息框的滚动窗
    JScrollPane jspChat = new JScrollPane(jtaChat);
 
    //创建当前在线列表的滚动窗
    JScrollPane jspOnline = new JScrollPane(jtbOnline);
 
    //设置默认窗口属性,连接窗口组件
    public ClientFrame()
    {
        //标题
        setTitle("聊天室");
        //大小
        setSize(WIDTH, HEIGHT);
        //不可缩放
        setResizable(false);
        //设置布局:不适用默认布局,完全自定义
        setLayout(null);
 
        //设置按钮大小和位置
        btnSend.setBounds(20, 600, 100, 60);
        btnClear.setBounds(140, 600, 100, 60);
        btnExit.setBounds(260, 600, 100, 60);
 
        //设置标签大小和位置
        lblReceiver.setBounds(20, 420, 300, 30);
 
        //设置按钮文本的字体
        btnSend.setFont(new Font("宋体", Font.BOLD, 18));
        btnClear.setFont(new Font("宋体", Font.BOLD, 18));
        btnExit.setFont(new Font("宋体", Font.BOLD, 18));
 
        //添加按钮
        this.add(btnSend);
        this.add(btnClear);
        this.add(btnExit);
 
        //添加标签
        this.add(lblReceiver);
 
        //设置文本输入框大小和位置
        jtaSay.setBounds(20, 460, 360, 120);
        //设置文本输入框字体
        jtaSay.setFont(new Font("楷体", Font.BOLD, 16));
        //添加文本输入框
        this.add(jtaSay);
        
        //聊天消息框自动换行
        jtaChat.setLineWrap(true);
        //聊天框不可编辑,只用来显示
        jtaChat.setEditable(false);
        //设置聊天框字体
        jtaChat.setFont(new Font("楷体", Font.BOLD, 16));
 
        //设置滚动窗的水平滚动条属性:不出现
        jspChat.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        //设置滚动窗的垂直滚动条属性:需要时自动出现
        jspChat.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        //设置滚动窗大小和位置
        jspChat.setBounds(20, 20, 360, 400);
        //添加聊天窗口的滚动窗
        this.add(jspChat);
 
        //设置滚动窗的水平滚动条属性:不出现
        jspOnline.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        //设置滚动窗的垂直滚动条属性:需要时自动出现
        jspOnline.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        //设置当前在线列表滚动窗大小和位置
        jspOnline.setBounds(420, 20, 250, 400);
        //添加当前在线列表
        this.add(jspOnline);
 
        //添加发送按钮的响应事件
        btnSend.addActionListener
                                (
                                     new ActionListener()
                                     {
                                        @Override
                                        public void actionPerformed(ActionEvent event)
                                        {
                                            //显示最新消息
                                            jtaChat.setCaretPosition(jtaChat.getDocument().getLength());
                                            try
                                            {
                                                //有收信人才发送
                                                if(Client1.uidReceiver.toString().equals("") == false)
                                                {
                                                    //在聊天窗打印发送动作信息
                                                    jtaChat.append(sdf.format(new Date()) + "\n发往 " + Client1.uidReceiver.toString() + ":\n");
                                                    //显示发送消息
                                                    jtaChat.append(jtaSay.getText() + "\n\n");
                                                    //向服务器发送聊天信息
                                                    OutputStream out = Client1.s.getOutputStream();
                                                    out.write(("Chat/" + Client1.uidReceiver.toString() + "/" + jtaSay.getText()).getBytes());
                                                } 
                                            }
                                            catch(Exception e){}
                                            finally
                                            {
                                                //文本输入框清除
                                                jtaSay.setText("");
                                            }
                                        }
                                     }
                                );
        //添加清屏按钮的响应事件
        btnClear.addActionListener
                                (
                                     new ActionListener()
                                     {
                                        @Override
                                        public void actionPerformed(ActionEvent event)
                                        {
                                            //聊天框清屏
                                            jtaChat.setText("");
                                        }
                                     }
                                );
        //添加退出按钮的响应事件
        btnExit.addActionListener
                                (
                                     new ActionListener()
                                     {
                                        @Override
                                        public void actionPerformed(ActionEvent event)
                                        {
                                            try
                                            {
                                                //向服务器发送退出信息
                                                OutputStream out = Client1.s.getOutputStream();
                                                out.write("Exit/".getBytes());
                                                //退出
                                                System.exit(0);
                                            }
                                            catch(Exception e){}
                                        }
                                     }
                                );
        //添加在线列表项被鼠标选中的相应事件
        jtbOnline.addMouseListener
                                (
                                    new MouseListener()
                                    {
                                        @Override
                                        public void mouseClicked(MouseEvent event)
                                        {
                                            //取得在线列表的数据模型
                                            DefaultTableModel tbm = (DefaultTableModel) jtbOnline.getModel();
                                            //提取鼠标选中的行作为消息目标,最少一个人,最多全体在线者接收消息
                                            int[] selectedIndex = jtbOnline.getSelectedRows();
                                            //将所有消息目标的uid拼接成一个字符串, 以逗号分隔
                                            Client1.uidReceiver = new StringBuilder("");
                                            for(int i = 0; i < selectedIndex.length; i++)
                                            {
                                                Client1.uidReceiver.append((String) tbm.getValueAt(selectedIndex[i], 1));
                                                Client1.uidReceiver.append(":");
                                                Client1.uidReceiver.append((String) tbm.getValueAt(selectedIndex[i], 2));
                                                if(i != selectedIndex.length - 1)
                                                    Client1.uidReceiver.append(",");
                                            }
                                            lblReceiver.setText("发给:" + Client1.uidReceiver.toString());
                                        }
                                        @Override
                                        public void mousePressed(MouseEvent event){};
                                        @Override
                                        public void mouseReleased(MouseEvent event){};
                                        @Override
                                        public void mouseEntered(MouseEvent event){};
                                        @Override
                                        public void mouseExited(MouseEvent event){};
                                    }
                                );
    }
}

四、其他

1.其它系统

Java+Swing实现学生选课管理系统
Java+Swing实现学校教务管理系统
Java+Swing+sqlserver学生成绩管理系统
Java+Swing用户信息管理系统
基于JavaSwing 银行管理系统
Java+Swing+mysql仿QQ聊天工具
Java+Swing 聊天室
Java+Swing+dat文件存储实现学生选课管理系统
Java+Swing可视化图像处理软件
Java+Swing学生信息管理系统
Java+Swing图书管理系统
Java+Swing图书管理系统2.0
基于java+swing+mysql图书管理系统3.0
大作业-基于java+swing+mysql北方传统民居信息管理系统

2.获取源码

点击下载
Java+Swing聊天室

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Dimension ss = Toolkit.getDefaultToolkit().getScreenSize(); public ChatClient(){ super("登录聊天室"); pnlLogin = new JPanel(); this.getContentPane().add(pnlLogin); lblServer = new JLabel("服务器:"); lblPort = new JLabel("端口:"); lblName = new JLabel("用户名:"); lblPassword = new JLabel("口 令:"); tfServer = new JTextField(15); tfServer.setText("127.0.0.1"); tfPort = new JTextField(6); tfPort.setText("8000"); tfName = new JTextField(20); pwd = new JPasswordField(20); btnLogin = new JButton("登录"); btnRegister = new JButton("注册"); btnExit=new JButton("退出"); pnlLogin.setLayout(null); pnlLogin.setBackground(new Color(205,112,159)); lblServer.setBounds(40,35,50,30); tfServer.setBounds(90,35,102,25); lblPort.setBounds(195,35,35,30); tfPort.setBounds(230,35,55,25); lblName.setBounds(40,70,50,30); tfName.setBounds(90,70,195,25); lblPassword.setBounds(40,100,50,30); pwd.setBounds(90,100,195,25); btnLogin.setBounds(30,160,70,25); btnRegister.setBounds(130,160,70,25); btnExit.setBounds(230,160,70,25); pnlLogin.add(lblServer); pnlLogin.add(tfServer); pnlLogin.add(lblPort); pnlLogin.add(tfPort); pnlLogin.add(lblName); pnlLogin.add(tfName); pnlLogin.add(lblPassword); pnlLogin.add(pwd); pnlLogin.add(btnLogin); pnlLogin.add(btnRegister); pnlLogin.add(btnExit); //设置登录窗口 setResizable(false); setSize(320,260); setVisible(true); setLocation((ss.width-getWidth())/2,(ss.height-getHeight())/2); //为按钮注册监听 btnLogin.addActionListener(this); btnRegister.addActionListener(this); btnExit.addActionListener(this); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } //按钮监听响应 public void actionPerformed(ActionEvent ae){ Object source = ae.getSource(); if (source.equals(btnLogin)){ if (tfName.getText().equals("") || pwd.getPassword().equals("")) JOptionPane.showMessageDialog(null, "用户名或密码不能为空"); else strServerIp = tfServer.getText(); login(); } if (source.equals(btnRegister)){ strServerIp = tfServer.getText(); this.dispose(); new Register(strServerIp,8000); } if (source == btnExit) { System.exit(0); } } public void login() { User data = new User(); data.name = tfName.getText(); data.password = new String(pwd.getPassword()); try { String str = InetAddress.getLocalHost().toString(); data.ip = " "+ str.substring(str.lastIndexOf("/"), str.length()); } catch (UnknownHostException ex) { Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, null, ex); } try{ Socket sock = new Socket(strServerIp,8000); ObjectOutputStream os = new ObjectOutputStream(sock.getOutputStream()); os.writeObject((User) data); //读来自服务器socket的登录状态 BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream())); String status = br.readLine(); if (status.equals("登陆成功")){ new ChatRoom((String)data.name,strServerIp); this.dispose(); //关闭流对象 os.close(); br.close(); sock.close(); } else{ JOptionPane.showMessageDialog(null, status); os.close(); br.close(); sock.close(); } } catch (ConnectException e1){ JOptionPane.showMessageDialog(null, "连接到制定服务器失败!"); } catch (InvalidClassException e2) { JOptionPane.showMessageDialog(null, "类错误!"); } catch (NotSerializableException e3) { JOptionPane.showMessageDialog(null, "对象未序列化!"); } catch (IOException e4) { JOptionPane.showMessageDialog(null, "不能写入到指定服务器!"); } } public static void main(String arg[]){ new ChatClient(); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五星资源

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

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

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

打赏作者

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

抵扣说明:

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

余额充值