java简易聊天程序

2023-11-19

目录

项目结构

TCP

窗体组成

 server

client

 properties



项目结构

 

TCP

窗体组成

 server

package cn.itcast.chat;

import javax.swing.*;
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.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Properties;

// 服务端类
// 如果一个类需要窗口界面的显示,那么该类就需要继承JFrame,该类就可以被称为而窗体类
// 1.定义窗体类组件
// 2.在构造方法中初始化属性
// 3.使用网络编程实现数据传输 (TCP,UDP 协议)
// 4.实现发送按钮的监听点击事件
    //需要注意的是,文本域拼接数据时,实现自己换行,不要在发送数据中使用 Svstem.ineSeparator( 换行)
// 5.实现回车键发送数据
public class ServerChatMain extends JFrame implements ActionListener, KeyListener {
    public static void main(String[] args) {
        new ServerChatMain();
    }

    //属性
    //文本域
    private JTextArea jTextArea;
    //滚动条
    private JScrollPane jScrollPane;
    //面板
    private JPanel jPanel;
    //文本框(发送消息)
    private JTextField jTextField;
    //按钮(发送)
    private JButton jButton;
    
    //输出流
    private BufferedWriter bufferedWriter ;
    //服务端端口号
    private static int serverPort;
    // 使用 static 静态代码块读取配置文件
        // 特点1.在类加载的时候,自动执行
        // 特点2,一个类只会被加载一次,因此静态代码块只会被执行一次
    static {
        Properties properties = new Properties();
        try {
            // 加载
            properties.load(new FileReader("chat.properties"));
            // 给属性赋值
            serverPort = Integer.parseInt(properties.getProperty("serverPort"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //构造方法初
    public ServerChatMain() {
        //始化组件
        //文本域
        jTextArea = new JTextArea();
        jTextArea.setEditable(false);//设置文本域不可编辑(默认),所以注释掉
        //  将文本域添加到滚动条中,实现滚动效果
        jScrollPane = new JScrollPane(jTextArea);
        //面板
        jPanel = new JPanel();
        //文本框长度10
        jTextField = new JTextField(20);
        //按钮
        jButton = new JButton("发送");
        //  将文本框和按钮添加到面板中
        jPanel.add(jTextField);
        jPanel.add(jButton);

        //将滚动条和面板全部添加到窗体中
        this.add(jScrollPane,BorderLayout.CENTER);//添加到中间
        this.add(jPanel,BorderLayout.SOUTH);//下面

        // 设置 标题、大小、标题、位置、关闭、是否可见
        this.setTitle("QQ聊天,服务端");
        this.setSize(500,500);
        this.setLocation(300,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭就退出
        this.setVisible(true);

        /***************** TCP 服务端 star  *************************/
        //给发送按钮绑定一个监听点击事件   需要实现 ActionListener 接口,重写方法
        jButton.addActionListener(this);
        // 给文本框绑定一个键盘点击事件 需要实现 KeyListener 接口,重写方法 keyPressed()
        jTextField.addKeyListener(this);
        try {
            // 1.创建服务端套接字
            ServerSocket serverSocket = new ServerSocket(serverPort);
            // 2.等待客户端的连接
            Socket socket = serverSocket.accept();
    
            // 4.获取socket 通道的输出流    (输出流实现写出数据,也是写一行,换一行,刷新) Bufferedwriter -> newLine();
            // 问题 : 什么时候需要写出数据??? 当用户点击~发送~ 按的时候才需要写出数据
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            // 3.获取socket 通道的输入流
            // 输出流是实现读取数据,如何读取 ??? 一行一行读取)  所以用 BufferedReader 类的 -> readLine()方法;
            InputStream input = socket.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input));

    
            // 循环读取数据、并拼接到文本域中
            String line = null;
            System.out.println("...............  " + bufferedReader.readLine());
            while ((line =bufferedReader.readLine()) != null){
                System.out.println("line: " + line);
                //将读取的数据拼接到上面文本域中显示
                jTextArea.append(line + System.lineSeparator());
            }
            // 5.关闭 serverSocket 通道
            serverSocket.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }


        /***************** TCP 服务端 end  **************************/

    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("发送按钮点击、进入了监听方法。。。。。");
        sendDataToSocket();
    }
    
    // 按下
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER){ //回车键
            System.out.println(e);//可以敲击不同的按键查看其 keyCode、keyText...
            sendDataToSocket();
        }
    }
    
    // 定义一个方法、将数据发送到 socket 通道中去
    private void sendDataToSocket(){
        // 1. 获取文本框中的发送内容
        String text = jTextField.getText();
        // 2. 拼接需要发送的内容数据
        text = "服务端对客户端说: " + text;
        // 3. 自己的文本域中显示
        jTextArea.append(text + System.lineSeparator());
        System.out.println("server: " + text);
        try {
            // 4. 发送 (这里需要用到 bufferedWriter 所以是字段)
            bufferedWriter.write(text);
            bufferedWriter.newLine();//换行
            bufferedWriter.flush();//刷新
            // 5. 清空文本框
            jTextField.setText("");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    // 被敲击
    @Override
    public void keyTyped(KeyEvent e) {
    }
    // 松开
    @Override
    public void keyReleased(KeyEvent e) {
    }
}

client

package cn.itcast.chat;

import javax.swing.*;
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.*;
import java.net.Socket;
import java.util.Properties;

public class ClientChatMain extends JFrame implements ActionListener, KeyListener {
    public static void main(String[] args) {
        new ClientChatMain();
    }

    //属性
    //文本域
    private JTextArea jTextArea;
    //滚动条
    private JScrollPane jScrollPane;
    //面板
    private JPanel jPanel;
    //文本框(发送消息)
    private JTextField jTextField;
    //按钮(发送)
    private JButton jButton;
   
    // 输出流
    BufferedWriter bufferedWriter = null;
    // 客户端 ip地址
    private static  String clientIP;
    // 客户端 port端口号
    private static  int clientPort;
    
    static {
        Properties properties = new Properties();
        try {
            // 加载
            properties.load(new FileReader("chat.properties"));
            // 给属性赋值
            clientIP = properties.getProperty("clientIP");
            clientPort = Integer.parseInt(properties.getProperty("clientPort"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    
    //构造方法初
    public ClientChatMain() {
        //始化组件
        //文本域
        jTextArea = new JTextArea();
        jTextArea.setEditable(false);//设置文本域不可编辑(默认),所以注释掉
        //  将文本域添加到滚动条中,实现滚动效果
        jScrollPane = new JScrollPane(jTextArea);
        //面板
        jPanel = new JPanel();
        //文本框长度10
        jTextField = new JTextField(20);
        //按钮
        jButton = new JButton("发送");
        //  将文本框和按钮添加到面板中
        jPanel.add(jTextField);
        jPanel.add(jButton);

        //将滚动条和面板全部添加到窗体中
        this.add(jScrollPane, BorderLayout.CENTER);//添加到中间
        this.add(jPanel,BorderLayout.SOUTH);//下面

        // 设置 标题、大小、标题、位置、关闭、是否可见
        this.setTitle("QQ聊天,客户端");
        this.setSize(500,500);
        this.setLocation(900,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭就退出
        this.setVisible(true);

        /***************** TCP 客户端 star  *************************/
        // 给发送按钮绑定一个监听事件
        jButton.addActionListener(this);
        // 给文本框绑定一个键盘点击事件
        jTextField.addKeyListener(this);
        try {
            // 1.创建客户端套接字(并且自动尝试连接)
            Socket socket = new Socket(clientIP, clientPort);
            // 2.获取socket 通道的输入流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // 3.获取socket 通道的输出流
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            // 循环读取数据、并拼接到文本域中
            String line = null;
            while ((line = bufferedReader.readLine()) != null){
                System.out.println("client: " + line);
                jTextArea.append(line + System.lineSeparator());
            }
            
            // 4.关闭socket通道
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        /***************** TCP 客户端 end  **************************/
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("发送按钮点击,进入了客户端.....");
        sendDataToSocket();
    }
    
    // 按下
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_ENTER){
            // 将数据发送到socket通道
            sendDataToSocket();
        }
    }
    
    private void sendDataToSocket() {
        // 1. 获取文本框中需要发送的数据内容
        String text = jTextField.getText();
        // 2. 拼接内容
        text = "客户端对服务端说: " + text;
        // 3. 自己显示
        jTextArea.append(text + System.lineSeparator());
        try {
            // 4. 发送
            bufferedWriter.write(text);
            bufferedWriter.newLine();
            bufferedWriter.flush();
            // 5. 清空
            jTextField.setText("");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    @Override
    public void keyTyped(KeyEvent e) {
    }
    @Override
    public void keyReleased(KeyEvent e) {
    
    }
}

 properties

serverPort=8888
clientIP=127.0.0.1
clientPort=8888

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java简易聊天程序 的相关文章

随机推荐

  • 面试官问:如何快速开发一个类似微信的聊天系统?

    去年我们公司要我去面试一位候选人 当时刚好我接手了公司的 IM 系统 借这个机会 就问了候选人这个问题 如何快速开发一个类似微信的聊天系统 这个问题的确让候选人回答起来很吃力 从分析 PC 端微信界面的实现到怎么处理框体也业务代码分离 从通
  • hibernate学习之hibernate的入门

    hibernate 可能对于我并不是很陌生 一个基于面向对象来操作SQL语句的框架 也就是一种ORM框架 在Java对象与关系型数据库之间建立某种映射 来实现直接存取Java对象 特点 将对数据库的操作直接转换为Java对象的操作 简化开发
  • flvplayer.swf flv视频播放器使用方法

    今天由于网页上要加入一个视频文件 就研究了一下flv视频播放器flvplayer swf 一 直接在html文件中加载 复制代码代码如下 div div
  • mybatis 加载顺序

    1 加载配置文件 解析配置文件 MyBatis基于XML配置文件创建Configuration对象的过程 2 SqlSessionFactoryBuilder根据传入的数据流生成Configuration对象 然后根据Configurati
  • 最常见的Java框架有哪些?

    Java语言仍然是程最受欢迎的编程语言之一 如果你想进入这个行业 Java可以引导你 很多初学者可能没有系统的了解过Java框架 今日为大家整理一下常见的Java框架有哪些 Java框架 一 Spring框架 Spring框架是Java后端
  • 区块链数字签名、验签,以及椭圆曲线算法JS库—elliptic的使用

    目录 一 简介 二 椭圆曲线密码elliptic 1 安装elliptic和js sha3 2 Keccak256 3 签名过程 一 简介 数字签名是一种将类似现实世界中物理签名 盖章
  • 更改element button 按钮颜色

    在全局的index scss里面改 显示时按钮样式 el button inblack 需要更改的按钮类型 background 060606 important border color 060606 important color ff
  • AppDomain一——基本原理

    一 问题的提出 技术一定是为了解决某个应用场景的问题而产生的 很多时候 我们都想使用 开发 USB式 热插拔 的应用 例如 开发一个WinForm应用 并且这个WinForm应用能允许开发人员定制扩展插件 我们不能关闭程序 在把新的dll替
  • vue项目部署方式:tomcat部署和nginx部署

    LINUX 发布 VUE项目 关于vue部署 1 nginx转发 一般项目前后端分离得话 都会用nginx作为反向代理转发的 因为项目要兼容ie9 使用axios发ajax请求的时候 不能通过CORS解决跨域的问题 所以尝试部署nginx作
  • 阿里云CDN架构接入WAF应用防火墙案例实践

    文章目录 1 网站架构变化 2 配置WAF应用防火墙 2 1 配置网站接入WAF防火墙 2 2 WAF防火墙生成CNAME地址 2 3 配置WAF防火墙HTTPS证书 2 4 WAF防火墙开启HTTP回源SLB 3 配置CDN加速器回源WA
  • 高德地图之地理编码

    首先申明是地理编码呢 地理编码 又称为地址匹配 是从已知的地址描述到对应的经纬度坐标的转换过程 该功能适用于根据用户输入的地址确认用户具体位置的场景 常用于配送人员根据用户输入的具体地址找地点 既地理编码 地址转坐标 下面一步步来看怎么实现
  • 面试题——Java中的锁

    文章目录 谈谈你对线程安全的理解 1 synchronized 关键字是怎么用的 1 1 构造方法可以使用 synchronized 关键字修饰么 1 2 使用 String 作为锁对象 会有什么问题 1 3 synchronized 的底
  • 单元测试到底是什么?应该怎么做?

    一 什么是单元测试 单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 至于 单元 的大小或范围 并没有一个明确的标准 单元 可以是一个函数 方法 类 功能模块或者子系统 单元测试通常和白盒测试联系到一起 如果单
  • 微信小程序open-data组件功能调整

    这里我开源了一个微信小程序的案例 https gitee com xiaoshixiaoran wechat applet 相关后台接口我会有空用SSM重写一遍再挂上去 由于微信小程序官网在2021 12 27号发布了组件功能调整 原来的获
  • 1-100之间的所有能被3整除的数字的和,偶数和奇数的和 ,平均值

    1 求 1 100 之间的所有平均值 需要一个 sum 和的变量 还需要一个平均值average变量 var sum 0 var average 0 for var i 1 i lt 100 i sum sum i average sum
  • 配置SourceTree

    一 从官网下载安装包 二 添加账户 选择这一个 否则看不到private仓库 用户名是自己github的用户名 密码需要在github生成 在这个位置点击 配置权限后就成功了 然后输入密码就行
  • HarmonyOS-开发避坑指南——源码下载和编译,企业级项目实战讲解

    安装文件系统打包工具 运行 mkfs vfat 如果未找到该命令 需要安装 运行 mcopy 如果未找到该命令 需要安装 sudo apt get install dosfstools mtools 官方文档说明的两个文件系统打包工具sud
  • windows终端的bash配置

    个人记录 现在json文件中加入 guid 00000000 0000 0000 ba54 000000000002 closeOnExit true commandline PROGRAMFILES git usr bin bash ex
  • 牛客网左神算法中级班学习笔记(第三章)

    本文是牛客网左神算法中级班学习笔记 分析 宏观考虑 搞两个点A B 起始都在左上角 B往右走 走到最右边就往下走 A往下走 走到最下边就往右走 A B每次一起走一步 打印A B两点连线即可 用一个Boolean控制下 交替打印顺序 publ
  • java简易聊天程序

    目录 项目结构 TCP 窗体组成 server client properties 项目结构 TCP 窗体组成 server package cn itcast chat import javax swing import java awt