简易的 Java Jframe窗体聊天室

本文档详细介绍了如何使用Java实现一个简单的TCP聊天应用,包括服务器端和客户端的创建。涉及组件初始化、事件监听、键盘事件处理以及数据的发送和接收。通过IDEA创建Java项目,设置配置文件,实现文本交互功能。
摘要由CSDN通过智能技术生成

说明:如果有一个类,需要有界面的显示,name该类就需要继承 JFrame此时,该类就可以被称为一个“窗体类"

1.定义JFrame窗体中的组件
2.在构造方法中初始化窗体组件
3.使用网络编程完成数据的传输(TCP ,UDP协议)
4.实现“发送”按钮的监听事件
5.实现回车键发送数据

使用工具 :IDEA

1.新建Java空项目–>新建Java module

新建类ServerChatMain

新建类ClientChatMain

新建文件chat.properties

在这里插入图片描述
在ServerChatMain 中定义需要用到的属性:

文本域 JTextArea
滚动条 JScrollPane
面板 JPanel
文本框 JTextField
按钮 JButton
输出流 BufferedWriter
客户端的IP地址 clientIp
客户端的Port端口号 clientPort

2.在chat.properties 文件中设置服务器端口号、客户机IP、客户机端口号

serverPort=6666
clientIp=127.0.0.1
clientPort=6666

创建 构造方法 ServerChatMain() ,在主方法中调用构造方法

在构造方法中初始化组件,需要初始化的内容:

1.文本域 2.滚动条 3.面板 4.按钮

//初始化组件
jta = new JTextArea();
//设置文本域默认不可编辑
jta.setEditable(false);
//注意:需要将文本域添加到滚动条中,实现滚动效果
jsp = new JScrollPane(jta);
//面板
jp = new JPanel();
//文本框的长度
jtf = new JTextField(15); 
 //按钮
jb = new JButton("发送");
//注意:需要将输入文本框和按钮添加到面板中
jp.add(jtf);
jp.add(jb);

需要设置的内容
文本域大小、标题、位置、关闭、是否可见

//注意:需要将滚动条域面板全部添加到窗体中
this.add(jsp, BorderLayout.CENTER);
this.add(jp, BorderLayout.SOUTH);//窗体的下面(南部)

//注意:需要设置 标题、大小、位置、关闭,是否可见
this.setTitle("聊天框 服务端");
this.setSize(400, 300);
this.setLocation(300, 300);
//窗体关闭,程序就退出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);

3.TCP 服务端 代码:

1.给发送按钮绑定监听事件
2.给文本框绑定监听事件,使用回车进行发送消息

//给发送按钮绑定一个监听绑定事件
jb.addActionListener(this);

//给文本框绑定一个键盘点击事件,使用回车发送信息
jtf.addKeyListener(this);
try {
    //1.创建一个服务端的套接字
    ServerSocket serverSocket = new ServerSocket(serverPort);

    //2.等待客户端的连接
    Socket socket =serverSocket.accept();

    //3.获取socker 通道的输入流(输入流是实现读取数据的,一行一行读取)
   BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    //4.获取socket 通道的输出流(写出数据,也是写一行换一行,刷新)
 
   bw= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

   String line =null;
    //循环读取数据,并拼接到文本域
   while((line =br.readLine())!=null){
       //如果读取的数据不为空,将读取的数据拼接到文本域中 ,拼接时要换行
       jta.append(line + System.lineSeparator());
   }

    // 5.关闭socket 通道
    serverSocket.close();

} catch (IOException e) {

}

4.重写键盘按下时事件的方法

@Override
public void keyPressed(KeyEvent e) {//键盘按下
    //回车键
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {//判断是不是回车键
        //发送数据到socket通道
        sendDataToSocket();//调用方法,省代码
    }

}

5.定义发送的方法

//定义一个方法,实现将数据发送到socket通道中
private void sendDataToSocket(){
    // 1.获取文本框中发送的内容
    String text =jtf.getText();
    //2.拼接发送的内容
    text ="服务端 对 客户端说:" + text;
    //3.自己也要显示
    jta.append(text + System.lineSeparator());
    //4.发送
    try {
        bw.write(text);
        bw.newLine();
        bw.flush();//刷新
        //5.清空文本框
        jtf.setText("");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

客户端部分代码:

与服务器端类似,初始化属性、加载外部配置文件、设置聊天框的属性、绑定监听事件、创建socket连接通道,获取输入流、重写键盘事件方法

/属性
//文本域
private JTextArea jta;
//滚动条
private JScrollPane jsp;
//面板
private JPanel jp;
//文本框
private JTextField jtf;
//按钮
private JButton jb;

//输出流
private BufferedWriter bw = null;

//客户端的IP地址
private  static  String clientIp;
//客户端的Port端口号
private static int clientPort;
//静态代码块加载外部配置文件
static {
    Properties prop =new Properties();
    try {
      //  prop.load(new FileReader("chat.properties"));
       prop.load(new FileReader("chat.properties"));
        clientIp =prop.getProperty("clientIp");
        clientPort =Integer.parseInt(prop.getProperty("clientPort"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public ClientChatMain() {
    //初始化组件
    jta = new JTextArea();
    //设置文本域默认不可编辑
    jta.setEditable(false);
    //注意:需要将文本域添加到滚动挑中,实现滚动效果
    jsp = new JScrollPane(jta);
    //面板
    jp = new JPanel();
    jtf = new JTextField(10); //文本框的长度
    jb = new JButton("发送"); //按钮
    //注意:需要将文本框域按钮添加到文本框中
    jp.add(jtf);
    jp.add(jb);

    //注意:需要将滚动条域面板全部添加到窗体中
    this.add(jsp, BorderLayout.CENTER);
    this.add(jp, BorderLayout.SOUTH);

    //注意:需要设置 标题、大小、位置、关闭,是否可见
    this.setTitle("聊天框 客户端");
    this.setSize(400, 300);
    this.setLocation(800, 300);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭,程序就退出
    this.setVisible(true);


    /*******************TCP 客户端 Start*****************/

    //给发送按钮绑定一个监听事件
    jb.addActionListener(this);

    //给文本框绑定键盘事件
    jtf.addKeyListener(this);

    try {
        //1.创建一个服务端的套接字(尝试连接)
        Socket socket = new Socket(clientIp, clientPort);

        //2.获取socker 通道的输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //3.获取socket 通道的输出流
        bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        //循环读取数据,并拼接到文本域
        String line = null;
        while ((line = br.readLine()) != null) { 
        //读取的数据是line 从br.readLine()中读取的
            jta.append(line + System.lineSeparator());
        }
        //4.关闭socket 通道
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }


    /*******************TCP 客户端 End*****************/

}

客户端发送消息代码

private void sendDataToSocket() {
    //1.获取文本框中需要发送的内容
    String text = jtf.getText();
    //2.拼接内容
    text = "客户端对服务端说:" + text;
    //3.自己显示
    jta.append(text + System.lineSeparator());
    //4.发送
    try {
        bw.write(text);
        bw.newLine();//换行
        bw.flush();//刷新
        //5.清空
        jtf.setText("");
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

先运行服务器端,在运行客户端
运行结果:
在这里插入图片描述
**

项目文件地址:

**
https://download.csdn.net/download/MushuiQwQ/20909412

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值