如何用Java开发一个多人在线聊天平台?

2026-05-24 03:052阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1432个文字,预计阅读时间需要6分钟。

如何用Java开发一个多人在线聊天平台?

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

开发环境:Windows 7 + 操作系统 + MyEclipse + 聊天室程序结构设计

1.系统分为客户端、服务器端和连接服务器

简化版:本文提供了Java实现多人聊天系统的整体代码示例,供参考。具体包括:

如何用Java开发一个多人在线聊天平台?

- 开发环境:Windows 7 + MyEclipse- 系统结构:客户端、服务器端及连接服务器

本文实例为大家分享了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.进入多人聊天室

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

本文共计1432个文字,预计阅读时间需要6分钟。

如何用Java开发一个多人在线聊天平台?

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

开发环境:Windows 7 + 操作系统 + MyEclipse + 聊天室程序结构设计

1.系统分为客户端、服务器端和连接服务器

简化版:本文提供了Java实现多人聊天系统的整体代码示例,供参考。具体包括:

如何用Java开发一个多人在线聊天平台?

- 开发环境:Windows 7 + MyEclipse- 系统结构:客户端、服务器端及连接服务器

本文实例为大家分享了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.进入多人聊天室

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