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

Java多线程实现多人聊天室功能

2024-04-02 19:04:59 257人浏览 泡泡鱼

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

摘要

本文为大家分享了Java多线程实现多人聊天室功能的具体代码,供大家参考,具体内容如下 1.实验目的: 编写一个 Java 应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗

本文为大家分享了Java多线程实现多人聊天室功能的具体代码,供大家参考,具体内容如下

1.实验目的:

编写一个 Java 应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗口标题是 “欢迎使用 XXX 聊天室应用”,其中 XXX 是自己的班级姓名学号,如“软件 171 张三 1234”。

2.实验代码:

服务端程序代码:

ServerChar.java


package works;

import java.io.DatainputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class ServerChat {

 //定义Map集合用于存储用户的Socket以及用户的名字   key:Socket    Value:用户名
 public final static Map<Socket,String> socketsMaps = Collections.synchronizedMap(new HashMap<Socket,String>());
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  try {
   // 创建服务端套接字
   ServerSocket serverSocket = new ServerSocket(9999); 
System.out.println("------服务端暴露-------");
   while (true) {
    // 监听客户端套接字,若有客户端连接,则代码不会往下执行,否则会堵塞在此处。
    Socket socket = serverSocket.accept();

    // 开启线程,用于读取客户端发送的信息,并转发给每一个客户端
    new ThreadServer(socket).start();
   }
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }
 }
}

class ThreadServer extends Thread {
 private Socket socket;
 ThreadServer(){};
 ThreadServer(Socket socket)
 {
  this.socket = socket;
 }
 @Override
 public void run() {
  try {
   while(true)
   {
    DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
    String data = dataInputStream.readUTF();
    
    if(data.startsWith("①②③④")&&data.endsWith("①②③④"))
    {
     //发送过来的是用户名
     //将Socket以及用户名字都存放在Map集合中
     ServerChat.socketsMaps.put(socket, data.replace("①②③④",""));
     //获取所有的key(Socket),将所有用户的名字发送至客户端
     Set<Socket> sockets = ServerChat.socketsMaps.keySet();
     //获取所有的用户的名字,将这些名字拼装成一个字符串
     Collection<String> names = ServerChat.socketsMaps.values();
     StringBuffer sbf = new StringBuffer();
     for(String userName :names)
     {
      sbf.append(userName).append(",");
     }
     System.out.println("sbf:"+sbf.toString());
     for(Socket soc:sockets)
     {
      DataOutputStream dataOutputStream = new DataOutputStream(soc.getOutputStream());
      dataOutputStream.writeUTF("①②③④"+sbf.toString()+"①②③④");
      dataOutputStream.flush();
     }
    }
    else{
     //发送过来的是聊天信息
     //获取所有的key(Socket),将所有用户的名字发送至客户端
     Set<Socket> sockets = ServerChat.socketsMaps.keySet();
     //將聊天信息广播出去
     for(Socket soc:sockets)
     {
      DataOutputStream dataOutputStream = new DataOutputStream(soc.getOutputStream());
      dataOutputStream.writeUTF("[ "+ServerChat.socketsMaps.get(socket)+" ]说:"+data);
      dataOutputStream.flush();
     }
     
     
    }
    
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

客户端程序代码:

ClientChar.java


package works;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.jscrollPane;
import javax.swing.JTextArea;

public class ClientChat {

 private JFrame mainWin = new JFrame("聊天窗口");

 // 消息展示框
 private JTextArea displayTa = new JTextArea(14, 40);
 // 在线用户名称展示框
 private DefaultListModel<String> userListModel = new DefaultListModel<>();
 private JList<String> userList = new JList<>(userListModel);
 // 消息发送框
 private JTextArea inputTF = new JTextArea(4, 40);
 // 消息按钮
 private JButton sendBn = new JButton("发送");
 // 用户记录当前聊天用户名
 private String curUser;

 public static void main(String[] args) {
  new ClientChat().init();
 }

 private void init() {
  try {
   // 通过弹出对话框获取用户输入的用户名
   String userName = JOptionPane.showInputDialog(mainWin, "请输入您的用户名:");
   // 把用户输入的用户名,赋给curUser
   curUser = userName;
   mainWin.setTitle(curUser + "的聊天窗口");

   // 创建套接字
   Socket socket = new Socket("192.168.193.1", 9999);
   // 向服务器声明
   DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
   //发送用户名到服务端
   dataOutputStream.writeUTF("①②③④"+userName+"①②③④");
   dataOutputStream.flush();

   // 开启线程,用于读取服务器发送的信息
   new ThreadClient(socket, this).start();

   JPanel bottomPanel = new JPanel();

   // 将消息框和按钮添加到窗口的底端
   mainWin.add(bottomPanel, BorderLayout.SOUTH);
   bottomPanel.add(inputTF);
   bottomPanel.add(sendBn);

   ActionListener listener = new ActionListener() {
    @Override
    public void actionPerfORMed(ActionEvent e) {
     // 获取用户发送的消息
     String message = inputTF.getText();
     sendSms(message,socket);
    }
   };
   // 给发送消息按钮绑定点击事件监听器
   sendBn.addActionListener(listener);

   JPanel centerPanel = new JPanel();

   // 将展示消息区centerPanel添加到窗口的中间
   mainWin.add(centerPanel);
   // 让展示消息区可以滚动
   centerPanel.add(new JScrollPane(displayTa));
   displayTa.setEditable(false);
   // 用户列表和是否私聊放到窗口的最右边
   Box rightBox = new Box(BoxLayout.Y_AXIS);
   userList.setFixedCellWidth(60);
   userList.setVisibleRowCount(13);
   rightBox.add(new JLabel("用户列表:"));
   rightBox.add(new JScrollPane(userList));

   centerPanel.add(rightBox);

   // 关闭窗口退出当前程序
   mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   mainWin.pack(); // swing加上这句就可以拥有关闭窗口的功能
   mainWin.setVisible(true);

  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }
 }
  //点击发送后将消息发送到服务器
  protected void sendSms(String sms, Socket socket) {
   try {
    //发送聊天消息到服务端
    DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
    dataOutputStream.writeUTF(sms);
    dataOutputStream.flush(); 
     
   } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
   }
  }

  public DefaultListModel<String> getUserListModel() {
   return userListModel;
  }

  public JTextArea getDisplayTa() {
   return displayTa;
  }
  public JTextArea getInputTF()
  {
   return inputTF;
  }
}

// 定义线程类,用来读取服务器发送的信息
class ThreadClient extends Thread {
 private Socket socket;
 private ClientChat clientChat;

 ThreadClient() {
 }

 ThreadClient(Socket socket, ClientChat clientChat) {
  this.socket = socket;
  this.clientChat = clientChat;
 }

 @Override
 public void run() {

  try {
   while (true) {
    DataInputStream DataInputStream = new DataInputStream(socket.getInputStream());
    String message = DataInputStream.readUTF();

    if(message.startsWith("①②③④")&&message.endsWith("①②③④"))
    {
     //说明信息是用户名
     String[] names = message.replace("①②③④","").split(",");
     // 将用户列表先清空
     clientChat.getUserListModel().clear();
     for (int i = 0; i < names.length; ++i) {
      clientChat.getUserListModel().addElement(names[i]);
     }
    }
    else
    {
     //说明是聊天信息,将聊天信息放在displayTa中
     clientChat.getInputTF().setText("");
     clientChat.getDisplayTa().append(message+"\t\n");
    }

    
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
}

3.实验截图

先开启服务端

再开启客户端

聊天过程

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

--结束END--

本文标题: Java多线程实现多人聊天室功能

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

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

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

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

下载Word文档
猜你喜欢
  • Java多线程实现多人聊天室功能
    本文为大家分享了Java多线程实现多人聊天室功能的具体代码,供大家参考,具体内容如下 1.实验目的: 编写一个 Java 应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗...
    99+
    2022-11-12
  • Java Socket+多线程实现多人聊天室功能
    本文实例为大家分享了Java Socket+多线程实现多人聊天室的具体代码,供大家参考,具体内容如下 思路简介 分为客户端和服务器两个类,所有的客户端将聊的内容发送给服务器,服务器接...
    99+
    2022-11-12
  • 怎么用Java Socket+多线程实现多人聊天室功能
    这篇文章主要讲解了“怎么用Java Socket+多线程实现多人聊天室功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Java Socket+多线程实现多人聊天室功能”吧!思路简介分...
    99+
    2023-06-20
  • Redis实现多人多聊天室功能
    本文为大家分享了Redis支持多人多聊天室功能的设计代码,供大家参考,具体内容如下 设计原理 左边的一个数据域,代表两个聊天室,聊天室id分别是827,729 在聊天室827里,有2个人,分别是jaso...
    99+
    2022-06-04
    多人多 聊天室 功能
  • Java实现多线程聊天室
    本文实例为大家分享了Java实现多线程聊天室的具体代码,供大家参考,具体内容如下 之前呢已经用单线程的方式来实现了聊天室,但其实它的功能并不齐全,下面用多线程来实现,功能会比单线程聊...
    99+
    2022-11-12
  • 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
  • java实现多人聊天对话室
    使用ServerSocket和Socket实现服务器端和客户端的Socket通信。 了解完socket通信步骤后可以发现本实验需要写两个类:Server和Client,并且要先运行...
    99+
    2022-11-12
  • C++实现多人聊天室
    本文实例为大家分享了C++实现多人聊天室的具体代码,供大家参考,具体内容如下 UDP 服务端代码: // Test_Console.cpp : 定义控制台应用程序的入口点。 //...
    99+
    2022-11-12
  • java实现多人聊天室可视化
    编写一个 Java 应用程序,实现图形界面多人聊天室(多线程实现),要求聊天室窗口标题是 “欢迎使用 XXX 聊天室应用”,其中 XXX 是自己的班级姓名学号...
    99+
    2022-11-13
  • Java基于Socket实现多人聊天室
    本文实例为大家分享了Java基于Socket实现简易版多人聊天室的具体代码,供大家参考,具体内容如下 一、 聊天室需求 1、一个服务端,多个客户端;2、实现客户端和服务端的交互;3、...
    99+
    2022-11-13
  • Java实现多人聊天室(含界面)
    本文实例为大家分享了Java实现多人聊天室的具体代码,供大家参考,具体内容如下 先说,记录本人的学习过程,当笔记了 多人聊天室分为 1.服务器 ①.while循环 (guanbo) ...
    99+
    2022-11-13
  • Java NIO实战之多人聊天室
    本文实例为大家分享了Java NIO实战之多人聊天室的具体代码,供大家参考,具体内容如下 NIO服务端 public class NioServer { pu...
    99+
    2022-11-12
  • java课程设计做一个多人聊天室(socket+多线程)
    目录课设要求相关知识点1.服务端能够看到所有在线用户2.服务端能够强制用户下线3.客户端能够看到所有在线用户4.客户端要求能够向某个用户发送消息5.运用JDBC实现持久化存储用户信息6.使用JSONObject对象封装数据7.使用Maven...
    99+
    2014-10-09
    java课程设计 毕业设计 java多人聊天室
  • java怎么实现多人聊天对话室
    这篇文章给大家分享的是有关java怎么实现多人聊天对话室的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用ServerSocket和Socket实现服务器端和客户端的Socket通信。了解完socket通信步骤后...
    99+
    2023-06-20
  • Java多线程局域网聊天室的实现
    目录1.TCP2.套接字3.C/S架构4.多线程5.服务器客户端局域网聊天室 在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为c++而轻视java的心态,搞了...
    99+
    2022-11-12
  • java实现多人聊天工具(socket+多线程)
    大一下学期的java期末课程设计:java实现多人聊天工具,分享一下 课设要求 多人聊天工具 服务器要求1:能够看到所有在线用户(25%) 服务器要求2:能够强制用...
    99+
    2022-11-12
  • js代码实现多人聊天室
    本文实例为大家分享了js代码实现多人聊天室的具体代码,供大家参考,具体内容如下 设计要求: 1)用户应通过注册登录聊天室 2)聊天室可以显示所有在线用户 3)在每一条聊天内容之前,显...
    99+
    2022-11-12
  • C#实现简易多人聊天室
    本文实例为大家分享了C#实现简易多人聊天室的具体代码,供大家参考,具体内容如下 只有一个群聊的功能 服务端 using System; using System.Collectio...
    99+
    2022-11-13
  • 利用C++实现多人聊天室
    本篇内容主要讲解“利用C++实现多人聊天室”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“利用C++实现多人聊天室”吧!本文实例为大家分享了C++实现多人聊天室的具体代码,供大家参考,具体内容如下...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作