用Java实现简易聊天室

这篇具有很好参考价值的文章主要介绍了用Java实现简易聊天室。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 文章来源地址https://www.toymoban.com/news/detail-503109.html

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

 

服务端代码:

package cn.qy.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.定义JFrame窗体中的组件
//2.在构造方法中初始化组件
//3.使用网络编程完成数据的传输(TCP,UDP协议)
//4.实现“发送”按钮的监听点击事件。需要注意的是,文本域拼接数据时,需要自己换行,不要在发送数据时换行。
public class ServerChatMain extends JFrame implements ActionListener, KeyListener {

    public static void main(String[] args) {
        // 调用构造器
        new ServerChatMain();
    }
    //属性

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

    //流
    BufferedReader br;
    BufferedWriter bw;

    //服务端端口号
    private static int serverPort;
    //静态代码块加载外部配置文件
    //特点1:在类加载时,自动执行
    //特点2:一个类只会加载一次,因此静态代码块只会执行一次
    static {
       Properties prop = new Properties();
       try {
           prop.load(new FileReader("chat.properties"));
           serverPort =Integer.parseInt(prop.getProperty("serverPort"));
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

    //创建空参构造器
    public ServerChatMain(){
        //初始化组件

        //初始化文本域
        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("QQ 服务端");
        this.setSize(300,300);
        this.setLocation(600,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭,程序退出
        this.setVisible(true);

        /******************TCP 服务端 start*****************/

        //给发送按钮绑定一个监听点击事件
        jb.addActionListener(this);
        //给文本框绑定一个键盘点击事件
        jtf.addKeyListener(this);
        //接收客户端数据,并回显到自己的文本域
        try {
            //1.创建一个服务端的套接字socket
            ServerSocket serverSocket = new ServerSocket(serverPort);
            //2.等待客户端的链接
            Socket socket = serverSocket.accept();//客户端对象
            //3.获取socket 通道的输入流(输入流是实现读取数据的,一行一行读取,因此用BufferedReader-->readLine
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //4.获取socket 通道的输出流(输出流实现写出数据,也是写一行,换一行,刷新)BufferedWriter-->new Line()
            //什么时候需要写出数据?当用户点击发送按钮时
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            //循环读取数据,并把它拼接到文本域中
            String line = null;
            while ((line=br.readLine())!=null){
                //将读取的数据拼接到文本域中显示
                jta.append(line+System.lineSeparator());
            }
            //5.关闭serverSocket 通道
            serverSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }



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

    }

    //行为
    /**
     * 重新ActionListener中的1个方法,实现点击 发送键 发送
     * @param e
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        sendDataToSocket();
    }
    /**
     * 重写KeyListener中的3个方法,实现Enter键发送
     * @param e
     */
    @Override
    public void keyPressed(KeyEvent e) {
        //回车键
        if (e.getKeyCode()== KeyEvent.VK_ENTER){
            //发送数据到socket通道
            sendDataToSocket();
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    //方法功能:发送数据到客户端,并将内容回显到自己的文本域
    public void sendDataToSocket(){
        //1.获取文本框中的内容
        String text = jtf.getText();
        //2.拼接需要发送的数据内容
        text = "服务端对客户端说:"+text;
        //3.自己也需要显示
        jta.append(text+System.lineSeparator());

        try {
            //4.发送
            bw.write(text);
            bw.newLine();
            bw.flush();
            //5.清空文本框
            jtf.setText("");
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

客户端代码:

package cn.qy.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;

//说明:如果一个类,需要有界面的显示,那么该类就需要继承自JFrame,此时,该类就可以被称为一个“窗体类
//1.定义JFrame窗体中的组件
//2.在构造方法中初始化组件
public class ClientChatMain extends JFrame implements ActionListener, KeyListener {

    public static void main(String[] args) {
        // 调用构造器
        new ClientChatMain();
    }
    //属性

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

    //流
    BufferedReader br;
    BufferedWriter bw;

    //通信的IP和Port
    private static int clientPort;
    private static String clientIP;
    //静态代码块加载外部配置文件
    //特点1:在类加载时,自动执行
    //特点2:一个类只会加载一次,因此静态代码块只会执行一次
    static {
        Properties prop = new Properties();
        try {
            prop.load(new FileReader("chat.properties"));
            clientPort = Integer.parseInt(prop.getProperty("clientPort"));
            clientIP = prop.getProperty("clientIP");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //创建构造器
    public ClientChatMain(){
        //初始化组件

        //初始化文本域
        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("QQ 客户端");
        this.setSize(300,300);
        this.setLocation(300,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭,程序退出
        this.setVisible(true);

        /******************TCP 客户端 start*****************/
        //给发送按钮绑定一个监听点击事件
        jb.addActionListener(this);
        //给键盘绑定单击事件
        jtf.addKeyListener(this);
        //接受服务端数据,并回显到自己的文本域
        try {
            //1.创建一个客户端的套接字socket
            Socket socket = new Socket(clientIP, clientPort);
            //2.获取socket 通道的输入流
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //3.获取socket 通道的输出流
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            //循环读取数据,并把它拼接到文本域中
            String line =null;
            while ((line=br.readLine())!=null){
                jta.append(line+System.lineSeparator());
            }

            //4.关闭socket 通道
            socket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }


        /******************TCP 客户端 end*****************/

    }

    //行为

    /**
     * 重新ActionListener中的1个方法,实现点击 发送键 发送
     * @param e
     */
    @Override
    public void actionPerformed(ActionEvent e) {
       sendDataToSocket();
    }

    /**
     * 重写KeyListener中的3个方法,实现Enter键发送
     * @param e
     */
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_ENTER){
            sendDataToSocket();
        }
    }
    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    //方法功能:发送数据到服务端,并将内容回显到自己的文本域
    private void sendDataToSocket(){
        //1.获取文本框中的内容
        String text = jtf.getText();
        //2.拼接需要发送的数据内容
        text = "客户端对服务端说:"+text;
        //3.自己也需要显示
        jta.append(text+System.lineSeparator());

        try {
            //4.发送
            bw.write(text);
            bw.newLine();
            bw.flush();
            //5.清空文本框
            jtf.setText("");
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

 启动时,必须先启动服务端,再启动客户端。

最终效果:

用Java实现简易聊天室

 

 

 

到了这里,关于用Java实现简易聊天室的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • websocket+elementui+vue实现简易聊天室

    搭建服务端环境 安装socket.io 服务端基于node,js的express框架生成,所以写成模块,引入至app.js中 其中,io.sockets.emit用于向所有建立连接的客户端发送信息,socket.broadcast.emit用于向除发送方之外的客户端发送信息。 客户端基于vue和elementui 进入聊天页面后,先判断用户是否登录,

    2024年04月25日
    浏览(47)
  • 利用Java EE相关技术实现一个简单的Web聊天室系统

    利用Java EE相关技术实现一个简单的Web聊天室系统 (1)编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息。 (2)通过请求指派来处理用户提交的登录信息,如果用户名为本小组成员的名字且密码为对应的学号时,跳转到LoginSuccess显示聊

    2024年02月07日
    浏览(38)
  • 基于WebSocket的简易聊天室的基本实现梳理

    目前在很多网站为了实现推送技术所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信

    2024年02月11日
    浏览(35)
  • WebSocket+Vue实现简易多人聊天室 以及 对异步调用的理解

    代码仓库:github   HTTP是不支持长连接的,WebSocket是一种通信协议,提供了在单一、长连接上进行全双工通信的方式。它被设计用于在Web浏览器和Web服务器之间实现,但也可以用于任何需要实时通信的应用程序。使用ws作为协议标识符,如果需要加密则使用wss作为协议标识符

    2024年01月17日
    浏览(57)
  • Vue + Element-Plus + SpringBoot + WebSocket实现简易网络聊天室

    项目流程图 1. 前端搭建:         前端用Vue+Element-Plus 来搭建,由登录页面和聊天页面组成 1.1 登录页面         由一个昵称输入框组成,用户输入自己的昵称若昵称和别的用户不重复,则可进入聊天室,否则提示错误并请重新输入。         这段代码是一个Vue.js组件的

    2024年02月03日
    浏览(60)
  • Netty简易聊天室

    通过一个简易的聊天室案例,讲述Netty的基本使用。同时分享案例代码。 项目中用到了log4j2,junit5,同时分享这些基础组件的使用。 项目中用到了awt,属于古董技术,只是用来做界面。非重点不用关注。 开发工具:idea2023,jdk:1.8,Maven:3.6.3 maven依赖 日志配置 src/main/resou

    2024年02月11日
    浏览(51)
  • 简易聊天室(Python版)

    目录 简介 运行效果 代码 客户端 服务器 自定义库 通讯协议及相关配置定义库(DY.py) 数据库调用库(SJK.py) 套接字库(TJZ.py) 套接字通讯库(服务器端)(TJZ_FZ.py) 一个用python写简易的聊天室程序,拥有登录、注册、找回密码、聊天功能,采用TPC通讯,无管理员功能,修改密

    2024年02月09日
    浏览(35)
  • 基于Java Socket写一个多线程的聊天室(附源码)

    Socket编程是在TCP/IP上的网络编程,但是Socket在上述模型的什么位置呢。这个位置被一个天才的理论家或者是抽象的计算机大神提出并且安排出来 ​ 我们可以发现Socket就在应用程序的传输层和应用层之间,设计了一个Socket抽象层,传输层的底一层的服务提供给Socket抽象层,S

    2024年02月10日
    浏览(51)
  • Java+Vue实现聊天室(WebSocket进阶-聊天记录)

    WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服

    2024年02月11日
    浏览(61)
  • 【WebSocket&IndexedDB】node+WebSocket&IndexedDB开发简易聊天室

    序幕介绍: WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 讲人话就是说: WebSocket 使得客户端和服务器之间的数据交换变得更加简单,在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包