我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java实现多人聊天系统

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java实现多人聊天系统

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

开发环境

Windows 7 操作系统
MyEclipse

聊天室程序结构设计

1.系统分为客户端、服务器端和连接服务器客户端三个模块。
2.客户端负责发送消息。
3.服务器端负责接收客户端发来的信息并执行相应操作处理,最后通过群发功能,使客户端将群聊的消息的显示出来。
4.连接服务器端负责连接服务器,从而进入客户端。

总体模块图

客户端代码

Client.java

package servlet;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.OutputStreamWriter;

public class Client {
              Socket socket;
              BufferedWriter bw;
              BufferedReader br ;
        
public Client(String ip, int port){
         try {
              socket =new Socket(ip,port);
              bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
              br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
              }catch (UnknownHostException e){
              e.printStackTrace();
              }catch(IOException e){
              e.printStackTrace();
                }
    }
public void sendMessage(String message) {
          try{ 
              bw.write(message);
              bw.newLine();
              bw.flush();
       }catch(IOException e){
             e.printStackTrace();
    
     }
   }

public String reciveMessage() {
       String message=null;
       try { 
           message = br.readLine();
      }catch(IOException e) {
          e.printStackTrace();
      }
    return message;
}

public void close(){
     try{
     socket.close();
    }catch(IOException e){
    e.printStackTrace();
    }
}}

ClientFrame.java

package servlet;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.Date;


import javax.swing.*;
import javax.swing.border.EmptyBorder;


public class ClientFrame extends JFrame {
    private JPanel contentPane;
    private JLabel lblUserName;
    private JTextField tfMessage;
    private JButton btnSend;
    private JTextArea textArea;
    private String userName;
    private Client client;

public ClientFrame(String ip,String userName){
    this.userName = userName;
    init();//添加窗体初始化内容
    addListener();
    client=new Client(ip,8080);
    ReadMessageThread t=new ReadMessageThread();
    t.start();
}
private class ReadMessageThread extends Thread{
     public void run() {
      while(true) {
          String str=client.reciveMessage();
          textArea.append(str+"\n");//添加文本内容
      }
  }
  
}
private void init(){
   setTitle("客户端");
   setResizable(false);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setBounds(100,100,450,300);

   contentPane = new JPanel();
   contentPane.setBorder(new EmptyBorder(5,5,5,5));
   contentPane.setLayout(null);
   setContentPane(contentPane);

   JScrollPane scrollPane = new JScrollPane();
   scrollPane.setBounds(5,5,434,229);
   contentPane.add(scrollPane);

  textArea =new JTextArea();
  scrollPane.setViewportView(textArea);
  textArea .setEditable(false);

  JPanel panel =new JPanel();
  panel.setBounds(5,235,434,32);
  contentPane.add(panel);
  panel.setLayout(null);

  lblUserName = new JLabel(userName);
  lblUserName.setHorizontalAlignment(SwingConstants.TRAILING);
  lblUserName.setBounds(2,4,55,22);
  panel.add(lblUserName);

  tfMessage =new JTextField();
  tfMessage.setBounds(62,5,274,22);
  tfMessage.setColumns(10);
  panel.add(tfMessage);

  btnSend =new JButton("发送");
  btnSend.setBounds(336,4,93,23);
  panel.add(btnSend);

  tfMessage.validate();
}
private void addListener(){
 btnSend.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
        Date date=new Date();
        SimpleDateFormat sf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        client.sendMessage(userName+""+sf.format(date)+":\n"+tfMessage.getText());
        tfMessage.setText("");//清空

          }
      });
   this.addWindowListener(new WindowAdapter(){//开启窗口监听
    public void windowClosing(WindowEvent atg0) {
        int op = JOptionPane.showConfirmDialog(ClientFrame.this,"确定要退出聊天室吗?","确定",JOptionPane.YES_NO_OPTION);
        if(op == JOptionPane.YES_OPTION) {
            client.sendMessage("%EXIT%:" + userName);
            try {
                Thread.sleep(200);
                
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
            client.close();
            System.exit(0);
        }
         }
      });
  }
}

LinkServerFrame.java

package servlet;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.border.EmptyBorder;

@SuppressWarnings("serial")
public class LinkServerFrame extends JFrame {

    private JPanel contentPane;//下方面板
    private JLabel lblIP;
    private JLabel lblUserName;
    private JTextField tfIP;
    private JTextField tfUserName;
    private JButton btnLink;


   public LinkServerFrame(){
    setTitle("连接服务器");
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 390, 150);

   contentPane = new JPanel();
   contentPane.setBorder(new EmptyBorder(5,5,5,5));
   contentPane.setLayout(null);
   setContentPane(contentPane);

   lblIP =new JLabel("服务器IP地址:");
   lblIP.setFont(new Font("微软雅黑",Font.PLAIN,14));
   lblIP.setBounds(20,15,100,15);
   contentPane.add(lblIP);

   tfIP =new JTextField("127.0.0.1");
   tfIP.setBounds(121,13,242,21);
   contentPane.add(tfIP);
   tfIP.setColumns(10);

   lblUserName = new JLabel("用户名:");
  lblUserName.setFont(new Font("微软雅黑",Font.PLAIN,14));
  lblUserName.setBounds(60,40,60,15);
   contentPane.add(lblUserName);

   tfUserName =new JTextField();
  tfUserName.setBounds(121,42,242,21);
  contentPane.add(tfUserName);
  tfUserName.setColumns(10);

  btnLink =new JButton("连接服务器");
  btnLink.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
      do_btnlink_actionPerformed(e);
  }
   });
  btnLink.setFont(new Font("微软雅黑",Font.PLAIN,14));
   btnLink.setBounds(140,80,120,23);
   contentPane.add(btnLink);//显示连接服务器窗口
 }
public static void main(String[] args){
     LinkServerFrame linkServerFrame = new LinkServerFrame();
     linkServerFrame.setVisible(true);
}
  protected void do_btnlink_actionPerformed(ActionEvent e) {
      if(!tfIP.getText().equals("")&&!tfUserName.getText().equals("")) {//文本框的内容不能为空
          dispose();//销毁当前窗口
         ClientFrame clientFrame=new ClientFrame(tfIP.getText().trim(), tfUserName.getText().trim());
          clientFrame.setVisible(true);//显示客户窗体
      }
      else {
          JOptionPane.showMessageDialog(null,"文本框里的内容不能为空!","警告",JOptionPane.WARNING_MESSAGE);
      }
       }
}

服务器端代码

Server.java

package servlet;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Server {
   private HashSet<Socket> allSocket;
   private ServerSocket server;


 public Server() {
     try {
        server = new ServerSocket(8080);
  }catch(IOException e) {

      e.printStackTrace();
  }
     allSocket=new HashSet<Socket>();
 } 
 public void startServer() throws IOException{
     while(true) {
         Socket socket =server.accept();
         System.out.println("用户已经进入聊天室");
         allSocket.add(socket);
         ServerThread t= new ServerThread(socket);
         t.start();
        
     }
 }
 private class ServerThread extends Thread{
       Socket socket;
     public ServerThread(Socket socket) {
       this.socket=socket;
     }
    public void run() {
         BufferedReader br=null;
         try {
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while(true) {
                String str=br.readLine();
                if(str.contains("%EXIT%")) {
                  String tmp=str.split(":")[1]+"用户退出聊天室";
                 sendMessageToALLClient(tmp);
                 allSocket.remove(socket);
                 socket.close();
                 return;    
                }
                sendMessageToALLClient(str);
            }
         }catch(IOException e) {
                e.printStackTrace();
            
         }
     }}
    private void sendMessageToALLClient(String str) throws IOException {
    for(Socket s: allSocket) {
        try{
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write(str);
        bw.newLine();
        bw.flush();
    }catch(IOException e) {
        e.printStackTrace();
            
         }
    }
 }
 public static void main(String[] args) {
     Server s = new Server();
     try {
         s.startServer();
     }catch(IOException e){
         e.printStackTrace();
     }
     }
 }

操作步骤

1.先运行服务器端代码(server.java)建立连接,然后运行客户端(LinkServerFrame.java)输入用户名

2.登入成功之后会显示用户已经进入聊天室

3.进入多人聊天室

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java实现多人聊天系统

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

下载Word文档

猜你喜欢

[Unity3D]多人聊天系统

又再一次修改unity web聊天的功能,之前的两次尝试都觉得服务器端性能太差了,写的还不够成熟,在龙哥的指导下,尝试使用IOCP重新写服务器端,使用线程池大大提高了socket处理性能,相比较之前多线程多个socket一一对应,是在只能是
2023-01-31

java怎么实现多人聊天对话室

这篇文章给大家分享的是有关java怎么实现多人聊天对话室的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用ServerSocket和Socket实现服务器端和客户端的Socket通信。了解完socket通信步骤后
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录