广告
返回顶部
首页 > 资讯 > 后端开发 > Python >javaGUI实现多人聊天功能
  • 297
分享到

javaGUI实现多人聊天功能

2024-04-02 19:04:59 297人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了javaGUI实现多人聊天的具体代码,供大家参考,具体内容如下 服务器 package com.ff.chat.chatserver.frame; import

本文实例为大家分享了javaGUI实现多人聊天的具体代码,供大家参考,具体内容如下

服务器

package com.ff.chat.chatserver.frame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DatainputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class ServerFrame extends JFrame {
    JTextArea msgArea;
    ArrayList<Socket> socketArrayList = new ArrayList<>();
    boolean serverFlag = true;//服务器启动标志
    StringBuffer sb = new StringBuffer();
    ServerSocket serverSocket;
    //创建服务器端的显示窗口
    public void creatFrame(){
        this.setTitle("聊天室-服务器端");
        this.setSize(500,500);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        //创建一个面板
        JPanel jp = new JPanel(new BorderLayout());

        //中间面板
        JPanel centerPanel = new JPanel();
        msgArea = new JTextArea(30,40);
        msgArea.setEditable(false);
        jscrollPane jsp = new JScrollPane(msgArea);
        centerPanel.add(jsp);

        jp.add(centerPanel);

        this.add(jp);
        this.setVisible(true);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                int res = JOptionPane.showConfirmDialog(null,"确定要关闭服务器吗?",
                        "操作提示",JOptionPane.OK_CANCEL_OPTION);
                if(res == 0){
                    try {
                        dispose();
                        serverSocket.close();
                    } catch (IOException ioException) {
                        ioException.printStackTrace();
                    }
                }
            }
        });
    }

    //启动服务器,创建ServerSocket
    public void startServer(){
        try {
            //创建ServerSocket
            serverSocket = new ServerSocket(9998);
            System.out.println("等待客户端连接");

            //循环监听客户端连接
            while (serverFlag){
                if(serverSocket.isClosed()){
                    serverFlag = false;
                    break;
                }
                Socket socket = serverSocket.accept();

                System.out.println("客户端连接成功");
                socketArrayList.add(socket);

                //为每一个客户端开启一个线程,监听客户端发来的消息
                new ServerThread(socket).start();
            }

        } catch (BindException b) {
            b.printStackTrace();
            System.out.println("服务器端口被占用");
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("服务器启动失败");
            serverFlag = false;
        }
    }

    //创建一个内部类,开启一个线程,接收消息
    class ServerThread extends Thread{
        Socket socket;
        DataInputStream in;
        DataOutputStream out;
        boolean clientFlag = true;

        public ServerThread(Socket socket){
            this.socket = socket;
            try {
                this.in = new DataInputStream(socket.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            //监听接收客户端发送的消息
            while (clientFlag){
                if(socket.isClosed()){
                    break;
                }
                try {
                    String msg = in.readUTF();//读到客户端发送的消息
                    sb.append(msg+"\n");
                    System.out.println(sb);
                    msgArea.setText(sb.toString());

                    //从服务器端向客户端发送消息
                    if(socketArrayList.size() > 0){
                        Iterator<Socket> it = socketArrayList.iterator();
                        while (it.hasNext()){
                            Socket soc = it.next();
                            if(soc.isClosed()){//当客户端某个socket已经为关闭状态,移除此socket
                                it.remove();
                                continue;
                            }
                            //客户端socket如果没有关闭,向客户端发送消息
                            out = new DataOutputStream(soc.getOutputStream());
                            out.writeUTF(sb.toString());
                            out.flush();
                        }
                    }
                } catch (EOFException ef){
                    System.out.println("ip为:"+socket.getInetAddress()+"的客户端下线了");
                    clientFlag = false;
                }catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
package com.ff.chat.chatserver.frame;

public class ServerRun {

    public static void main(String[] args) {
        ServerFrame serverFrame = new ServerFrame();
        serverFrame.creatFrame();
        serverFrame.startServer();

    }
}

客户端

注意:要在自己的电脑上运行多次客户端需要勾选如下选项

1.登录界面

package com.ff.chat.chatclient.frame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.Socket;

public class LoginFrame extends JFrame {

    JTextField accountField = null;

    //创建窗口
    public void creatFrame(){
        this.setTitle("聊天窗口");
        this.setSize(400,400);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        
        JPanel jp = new JPanel(new GridLayout(4,1));

        //欢迎登陆面板
        JPanel welcomePanel = new JPanel();
        JLabel welcomLabel = new JLabel("欢迎登陆");
        welcomePanel.add(welcomLabel);

        //账号面板
        JPanel accountPanel = new JPanel();
        JLabel accountLabel = new JLabel("账号");
        accountField = new JTextField(15);
        accountPanel.add(accountLabel);
        accountPanel.add(accountField);

        //密码面板
        JPanel passWordPanel = new JPanel();
        JLabel passwordLabel = new JLabel("密码");
        JPasswordField passwordField = new JPasswordField(15);
        passwordPanel.add(passwordLabel);
        passwordPanel.add(passwordField);

        //登录按钮面板
        JPanel btnPanel = new JPanel();
        JButton loginBtn = new JButton("登录");
        JButton regBtn = new JButton("注册");
        btnPanel.add(loginBtn);
        btnPanel.add(regBtn);

        jp.add(welcomePanel);
        jp.add(accountPanel);
        jp.add(passwordPanel);
        jp.add(btnPanel);
        this.add(jp);

        this.setVisible(true);

        //组件绑定事件监听
        loginBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerfORMed(ActionEvent e) {
                //获得账号密码
                String account = accountField.getText();
                String password = new String(passwordField.getPassword());
                if(account.length() == 0){
                    JOptionPane.showMessageDialog(null,"账号不能为空",
                            "操作提示",JOptionPane.WARNING_MESSAGE);
                    return;
                }
                if(password.length() == 0){
                    JOptionPane.showMessageDialog(null,"密码不能为空",
                            "操作提示",JOptionPane.WARNING_MESSAGE);
                    return;
                }

                //预留2.0版本 与数据库交互

                //连接服务器,创建Socket对象
                try {
                    Socket socket = new Socket("192.168.31.179",9998);//该地址为要连接的服务器的地址
                    new ClientFrame(socket,account).creatFrame();
                    dispose(); //释放当前登录窗口
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                    JOptionPane.showMessageDialog(null,"服务器连接失败",
                            "操作提示",JOptionPane.WARNING_MESSAGE);
                }
            }
        });
    }


}

2.聊天界面

package com.ff.chat.chatclient.frame;

import com.ff.chat.chatclient.utils.DateUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Date;

public class ClientFrame extends JFrame {

    String account;
    Socket socket;
    DataOutputStream out;//数据输出字节流
    DataInputStream in;//数据输入字节流
    JTextArea msgArea;


    //创建聊天窗口时,初始化数据
    public ClientFrame(Socket socket,String account){
        this.socket = socket;
        this.account = account;
        try {
            out = new DataOutputStream(socket.getOutputStream());
            in = new DataInputStream(socket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //创建聊天窗口
    public void creatFrame(){
        this.setTitle("聊天窗口-"+account);
        this.setSize(500,500);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        //创建一个面板
        JPanel jp = new JPanel(new BorderLayout());

        //中间面板
        JPanel centerPanel = new JPanel();
        msgArea = new JTextArea(30,40);
        msgArea.setEditable(false);//不可以直接编辑
        JScrollPane jsp = new JScrollPane(msgArea);
        centerPanel.add(jsp);

        //底部面板
        JPanel bottomPanel = new JPanel();
        JTextField msg = new JTextField(30);
        JButton sendBtn = new JButton("发送");
        bottomPanel.add(msg);
        bottomPanel.add(sendBtn);

        jp.add(centerPanel);
        jp.add(bottomPanel,BorderLayout.SOUTH);

        this.add(jp);
        this.setVisible(true);

        //发送按钮添加监听事件
        sendBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String m = msg.getText(); //获得客户端输入的聊天内容
                if(m.length() == 0){
                    JOptionPane.showMessageDialog(null,"不能发送空白消息");
                    return;
                }
                //向服务器发送消息
                try {
                    String ms = account+":"+DateUtil.dateStr(new Date())+"\n"+m;
                    out.writeUTF(ms);//向服务器发送消息
                    out.flush();
                    msg.setText("");//发送成功,清空聊天文本框
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                    JOptionPane.showMessageDialog(null,"服务器连接失败");
                }

            }
        });

        //聊天窗口添加事件监听
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                int res = JOptionPane.showConfirmDialog(null,"你确定要退出吗?",
                        "操作提示",JOptionPane.OK_CANCEL_OPTION);
                if(res == 0){
                    dispose();
                    new LoginFrame().creatFrame();
                }
                try {
                    socket.close();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        });

        //启动一个线程,监听服务器是否向客户端发送了消息
        new ClientThread(socket).start();
    }

    //创建一个内部类
    class ClientThread extends Thread{
        //接收从服务器发来的消息
        Socket socket;
        boolean serverFlag = true;

        public ClientThread(Socket socket){
            this.socket = socket;
        }

        @Override
        public void run(){
            //监听接收服务器发来的消息
            while (serverFlag){
                try {
                    String ms = in.readUTF();
                    msgArea.setText(ms);
                } catch (IOException e) {
                    System.out.println("客户端"+account+"下线了");
                    serverFlag = false;
                }
            }
        }
    }
}

3.运行客户端

package com.ff.chat.chatclient.frame;

public class ClientRun {

    public static void main(String[] args) {
        new LoginFrame().creatFrame();
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: javaGUI实现多人聊天功能

本文链接: https://www.lsjlt.com/news/167661.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • javaGUI实现多人聊天功能
    本文实例为大家分享了javaGUI实现多人聊天的具体代码,供大家参考,具体内容如下 服务器 package com.ff.chat.chatserver.frame; import...
    99+
    2022-11-13
  • JavaGUI如何模仿实现QQ聊天功能
    小编给大家分享一下JavaGUI如何模仿实现QQ聊天功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下ClientForm代码:package GUISocket.chat.Client;import...
    99+
    2023-06-20
  • Redis实现多人多聊天室功能
    本文为大家分享了Redis支持多人多聊天室功能的设计代码,供大家参考,具体内容如下 设计原理 左边的一个数据域,代表两个聊天室,聊天室id分别是827,729 在聊天室827里,有2个人,分别是jaso...
    99+
    2022-06-04
    多人多 聊天室 功能
  • Java多线程实现多人聊天室功能
    本文为大家分享了Java多线程实现多人聊天室功能的具体代码,供大家参考,具体内容如下 1.实验目的: 编写一个 Java 应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗...
    99+
    2022-11-12
  • C#基于Socket实现多人聊天功能
    本文实例为大家分享了C#基于Socket实现多人聊天功能的具体代码,供大家参考,具体内容如下 服务器 服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户。 代码: u...
    99+
    2022-11-13
  • java使用UDP实现多人聊天功能
    使用UDP实现简单聊天功能,供大家参考,具体内容如下 使用UDP实现一个简单的多人聊天功能。该程序使用了多线程,实现了聊天功能。 package 课后作业.E103_10_聊天; ...
    99+
    2022-11-13
  • Java Socket+多线程实现多人聊天室功能
    本文实例为大家分享了Java Socket+多线程实现多人聊天室的具体代码,供大家参考,具体内容如下 思路简介 分为客户端和服务器两个类,所有的客户端将聊的内容发送给服务器,服务器接...
    99+
    2022-11-12
  • JavaGUI模仿QQ聊天功能完整版
    本文实例为大家分享了JavaGUI模仿QQ聊天功能完整代码,供大家参考,具体内容如下 ClientForm代码: package GUISocket.chat.Client; ...
    99+
    2022-11-12
  • C#如何基于Socket实现多人聊天功能
    这篇文章主要介绍C#如何基于Socket实现多人聊天功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下服务器服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户。代码:using ...
    99+
    2023-06-29
  • java使用udp实现简单多人聊天功能
    本文实例为大家分享了udp实现简单的多人聊天功能,供大家参考,具体内容如下 多个客户端向服务器发送信息,服务端再将信息返回到各个客户端。 这是接收udp的实现类: public cl...
    99+
    2022-11-13
  • Ratchet实现PHP WebSocket多人聊天功能的示例
       composer 安装ratchet composer require cboden/ratchet 使用PDO连接数据库,创建mysql命令如下 CREATE TABLE messages ( id INT AUTO_INC...
    99+
    2023-08-31
    php websocket 开发语言
  • Python+Socket实现多人聊天室,功能:好友聊天、群聊、图片、表情、文件等
    一、项目简介 本项目主要基于python实现的多人聊天室,主要的功能如下: 登录注册添加好友与好友进行私聊创建群聊邀请/申请加入群聊聊天发送图片聊天发送表情聊天发送文件聊天记录保存在本地中聊天过程中发送的文件保存本地 二、环境介绍 pyth...
    99+
    2023-08-17
    python flask mysql
  • 怎么用Java Socket+多线程实现多人聊天室功能
    这篇文章主要讲解了“怎么用Java Socket+多线程实现多人聊天室功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Java Socket+多线程实现多人聊天室功能”吧!思路简介分...
    99+
    2023-06-20
  • C++实现多人聊天室
    本文实例为大家分享了C++实现多人聊天室的具体代码,供大家参考,具体内容如下 UDP 服务端代码: // Test_Console.cpp : 定义控制台应用程序的入口点。 //...
    99+
    2022-11-12
  • 使用python实现机器人聊天功能
    利用python实现一个机器人聊天功能,具体方法如下:import aimlimport sysimport osdef get_module_dir(name):print("module", sys.modules[name])path...
    99+
    2022-10-22
  • java实现多客户聊天功能
    java 实现多客户端聊天(TCP),供大家参考,具体内容如下 1. 编程思想: 1)、要想实现多客户端聊天,首先需要有多个客户端,而这些客户端需要随时发送消息和接受消息,所以收发消...
    99+
    2022-11-12
  • java实现多人聊天系统
    本文实例为大家分享了java实现多人聊天系统的具体代码,供大家参考,具体内容如下 开发环境 Windows 7 操作系统MyEclipse 聊天室程序结构设计 1.系统分为客户端、服...
    99+
    2022-11-13
  • Java NIO实现多人聊天室
    本文实例为大家分享了Java NIO实现多人聊天室的具体代码,供大家参考,具体内容如下 1. 服务器端代码 ChatServer类: package nio.test.serve...
    99+
    2022-11-12
  • Java编写实现多人聊天室
    本文实例为大家分享了Java实现多人聊天室的具体代码,供大家参考,具体内容如下 1.客户端 package tk.javazhangwei.net.tcp.chat.Demo03; ...
    99+
    2022-11-13
  • js代码实现多人聊天室
    本文实例为大家分享了js代码实现多人聊天室的具体代码,供大家参考,具体内容如下 设计要求: 1)用户应通过注册登录聊天室 2)聊天室可以显示所有在线用户 3)在每一条聊天内容之前,显...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作