@

目录

  • 一、系统介绍
  • 二、系统展示
  • 1.发送消息
  • 2.清屏
  • 三、系统实现
  • 四、获取源码

一、系统介绍

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

二、系统展示

1.发送消息

ideajava聊天室 java swing聊天室_文本输入框

2.清屏

ideajava聊天室 java swing聊天室_文本输入框_02

三、系统实现

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