简易的 Java Jframe窗体聊天室

说明:如果有一个类,需要有界面的显示,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();
    }
}

 先运行服务器端,在运行客户端

运行结果:

 

项目文件地址:

 简易的JavaJframe窗体聊天室-Java文档类资源-CSDN下载

 

posted @ 2021-08-07 23:01  大星星不见了  阅读(482)  评论(0编辑  收藏  举报