首页 > 编程语言 >Java+Swing 聊天室

Java+Swing 聊天室

时间:2023-02-07 09:23:59浏览次数:37  
标签:聊天室 Java String cframe jtaChat Swing new public 在线

@

目录

一、系统介绍

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

二、系统展示

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

四、获取源码

请联系QQ:2080866767

标签:聊天室,Java,String,cframe,jtaChat,Swing,new,public,在线
From: https://www.cnblogs.com/Timi2019/p/16982302.html

相关文章

  • Java 使用递归构建树
    publicclassMenuTree1{/***构建结束的树*/privatestaticList<Menu>menuList;/***构建树*@parammenuId树的根节点id0:代表顶级......
  • java8新特性之List处理
    1.集合中获取指定的一个属性值List<String>items=li.stream().map(ScdCostChargeItemEntity::getItem).collect(Collectors.toList()); 2.集合分组Map<String,......
  • Java泛型中<?>和<T>的区别浅析
    https://www.jb51.net/article/270336.htm一、定义1、T代表一种类型可以加在类上,也可以加在方法上1)T加在类上123classSuperClass<A>{    //tod......
  • java8中时间的各种转换(LocalDateTime)
      java8中时间的各种转换(LocalDateTime)1.将LocalDateTime转为自定义的时间格式的字符串publicstaticStringgetDateTimeAsString(LocalDateTimelocalDateTime......
  • 读Java实战(第二版)笔记03_引入和使用流
    1. 流1.1. 以声明性方式处理数据集合1.2. 通过查询语句来表达,而不是临时编写一个实现1.3. 遍历数据集的高级迭代器1.4. 透明地并行处理1.5. 从支持数据处理操......
  • 通俗易懂的理解java泛型
    泛型是JAVA1.5版本之后引入的一个新特性,它允许在定义类、接口和方法的时候使用类型参数,这些类型参数将在使用时确定。泛型的引入,使得JAVA具有了更好的代码复用性,更好的类......
  • Java中保留两位小数之format
    String.format仅限double类型可用int类型会报错doubled1=6.6666;System.out.println(String.format("%.2f",d1));//设置保留两位小数注意:没有小数位或者小数位不够你......
  • java基础
    JAVA基础注释单行注释////这代表单行注释多行注释/**//*多行注释可以在连续多行编写注释*/文档注释/***//***这是文档注释*/标识符只能以字母、......
  • Debugger data model, Javascript & x64 exception handling
    Debuggerdatamodel,Javascript&x64exceptionhandlingDate Fri01December2017 By Axel"0vercl0k"Souchet Category debugging Tags debugging javasc......
  • Java多线程03——线程安全和线程同步
    1 线程的同步安全1.1线程安全问题设计并发编程的目的是为了使程序获得更高的执行效率,但绝不能出现数据一致性问题。比如多个渠道共同出售电影票,如果没有进行安全控制,就会......