群聊

用户在客户端登录 (不涉及数据库)随便输入账号密码

进入聊天室

发送聊天内容

显示聊天内容

多个客户端 一个服务器端(监听存储连接到的客户端 一直处于监听状态)

功能设计:

(1)客户端:

1.启动客户端 就是一个登陆窗口

2.输入信息 点击登陆

3.连接服务器端,不成功给提示 成功进聊天窗口

4.制作聊天窗口

5.输入聊天内容,点击发送

6.在客户端监听接收服务器响应的内容

(2)服务器端:

1.启动服务器端 创建ServerSocket

  1. 循环监听客户端的连接,如果客户端连接到服务器存储客户端Socket

  2. 创建线程 在线程中监听自己客户端发送的内容

  3. 接收之后将内容转发给其他客户端

package com.ffyc.chatrom.server;import java.io.DataInputStream;
import java.io.DataOutputStream;
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 Server {//存储连接到服务器的所有客户端ArrayList<Socket> sockets=new ArrayList<>();public void startServer(int port) throws IOException {try {ServerSocket serverSocket=new ServerSocket(port); //端口System.out.println("服务器启动成功");while (true){//一直监听Socket socket=serverSocket.accept();//监听客户端的连接sockets.add(socket);//存储已连接的客户端System.out.println("有"+sockets.size()+"个客户端连接成功");//启动线程new SocketThread(socket).start();//每接收到一个客户端就开启线程}}catch (BindException b){b.printStackTrace();System.out.println("端口被占用异常");//自定义端口 则端口有可能被其他占用}catch (IOException o){o.printStackTrace();System.out.println("服务器启动失败");}}//在服务端创建线程 接收各自客户端发送的消息 并向其他客户端转发class SocketThread extends Thread{Socket socket;//socket 构造方法传过来DataInputStream dataInputStream;//接收数据
Boolean flo=true;public SocketThread(Socket socket) throws IOException {this.socket = socket;this.dataInputStream=new DataInputStream(socket.getInputStream());}@Overridepublic void run() {while (flo){//一直处于接收状态try {String s=dataInputStream.readUTF();//接收客户端发送的信息//向连接到服务器的客户端转发消息Iterator<Socket> iterator=sockets.iterator();  //迭代器迭代(迭代过程可以remove删除)while (iterator.hasNext()){//如果迭代里面有客户端的话Socket so=iterator.next();//拿到他if (so.isClosed()){//如果客户端so是关闭的  移除  (判断socket状态)iterator.remove();continue;}//转发// 给拿到的客户端发  即soDataOutputStream dataOutputStream=new DataOutputStream(so.getOutputStream());
dataOutputStream.writeUTF(s);}} catch (IOException e) {e.printStackTrace();System.out.println("客户端断开");sockets.remove(socket);//他下线了就把他移出集合flo=false;//就不执行了}}}}
}
package com.ffyc.chatrom.server;import java.io.IOException;public class ServerRun {//启动  一个项目里就一个启动public static void main(String[] args) throws IOException {new Server().startServer(1234);//启动服务器  把端口传过去}
}
package com.ffyc.chatroom.client;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;public class LoginFrame extends JFrame {//登陆界面JTextField account;//账号 构造方法传过去public LoginFrame(){//构造方法创建窗口//JFrame jFrame=new JFrame("登陆界面");//   jFrame.setLocation(500,500);//设置窗口大小this.setSize(300,200);this.setTitle("登陆界面");this.setResizable(false);this.setLocationRelativeTo(null);//窗口出现在屏幕中间this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//布局  网格JPanel jPanel=new JPanel(new GridLayout(3,1));//创建一个面板  流式布局JPanel jp1=new JPanel();
JLabel label1=new JLabel("账号");
JTextField account=new JTextField(15);
jp1.add(label1);
jp1.add(account);JPanel jp2=new JPanel();
JLabel label2=new JLabel("密码");
JPasswordField jPasswordField=new JPasswordField(15);
jp2.add(label2);
jp2.add(jPasswordField);JPanel jp3=new JPanel();
JButton jButton1=new JButton("登陆");
JButton jButton2=new JButton("取消");
jp3.add(jButton1);
jp3.add(jButton2);jPanel.add(jp1);
jPanel.add(jp2);
jPanel.add(jp3);//事件监听 +   事件处理jButton1.addActionListener(new ActionListener() {//登录@Overridepublic void actionPerformed(ActionEvent e) {try {String accountText = account.getText();//获取输入的内容String passwordTest = new String(jPasswordField.getPassword());//.getPassword获取的是char[]数组 把char数组放到new的String类里面就能转换成String类if (accountText.length() == 0) {JOptionPane.showMessageDialog(null, "账号不能为空", "来自系统的提示", JOptionPane.WARNING_MESSAGE);return;//不加return 就会继续往下走   所以不满足规则就停}if (passwordTest.length() == 0) {JOptionPane.showMessageDialog(null, "密码不能为空", "来自系统的提示", JOptionPane.INFORMATION_MESSAGE);return;}/*后续与数据库连接*///怎么进另一个窗口  new一个对象调他的构造方法就行了try {Socket socket = new Socket("192.168.32.5", 1234);//如果没有问题  进入聊天窗口new ChatFrame(accountText, socket);//打开聊天窗口dispose();//释放当前窗口} catch (UnknownHostException un) {//ip异常  乱写un.printStackTrace();JOptionPane.showMessageDialog(null, "ip错误");} catch (IOException io) {io.printStackTrace();JOptionPane.showMessageDialog(null, "连接服务器失败");}dispose();//释放当前窗口} catch (Exception exception) {exception.printStackTrace();JOptionPane.showMessageDialog(null, "系统故障!");}}});jButton2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {account.setText("");jPasswordField.setText("");}});this.add(jPanel);this.setVisible(true);//显示窗口}}
package com.ffyc.chatroom.client;import javax.swing.*;
import javax.xml.crypto.Data;
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.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.sql.Time;
import java.util.Calendar;
import java.util.GregorianCalendar;public class ChatFrame extends JFrame {Socket socket;//给哪发String account;//账号  谁发的JTextArea jTextArea;//放在构造方法 好传DataOutputStream dataOutputStream;//String message1;//接收到的信息Calendar c = new GregorianCalendar();public ChatFrame(String account,Socket socket) throws IOException {this.account = account;this.socket = socket;this.dataOutputStream = new DataOutputStream(socket.getOutputStream());//JFrame jFrame = new JFrame("欢迎来到多人聊天室");this.setSize(500, 500);this.setLocationRelativeTo(null);//窗口出现在屏幕中间this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle("欢迎" + this.account + "来到聊天室");this.setVisible(true);/*//设置字体颜色JTextPane jTextPane=new JTextPane();JColorChooser jColorChooser=new JColorChooser();jColorChooser.setColor(Color.red);*/JPanel jPanel = new JPanel(new BorderLayout());//边界布局jTextArea = new JTextArea();//文本域  显示聊天内容jTextArea.setEditable(false);//文本内容不可修改JScrollPane js = new JScrollPane(jTextArea);//创建滚蛋面板  把文本放进去  让文本域可以滚动jPanel.add(js);//把滚动面板放到大面板中JPanel sendjPanel = new JPanel();//聊天内容面板JTextField message = new JTextField(30);//文本输入面板JButton sendJB = new JButton("发送");sendjPanel.add(message);sendjPanel.add(sendJB);jPanel.add(sendjPanel, BorderLayout.SOUTH);//添加到底部this.add(jPanel);//为窗口添加监听this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {int a = JOptionPane.showConfirmDialog(null, "您确定要关闭吗");if (a == 0) {//确定退出try {socket.close();dataOutputStream.close();dispose();new LoginFrame();//返回登陆界面} catch (IOException ioException) {ioException.printStackTrace();}}}});//发送聊天内容sendJB.addActionListener((e) -> {String message0 = message.getText();if (message0.length() == 0) {JOptionPane.showMessageDialog(null, "内容不能为空");return;//结束  不然还要往下走}message0 = this.account +c.getTime() +"  " + "\n" + message0+"\n";// jTextArea.append(message0);//追加  把信息加到原来的上面  保留了原来的信息 不被覆盖try {dataOutputStream.writeUTF(message0);message.setText(" ");} catch (IOException ioException) {ioException.printStackTrace();JOptionPane.showMessageDialog(null, "网络连接失败");}});//客户端还需要一个监听器  接收服务器发送(转发)的消息new jieshouThread(socket,jTextArea).start();jTextArea.append(message1);}}
package com.ffyc.chatroom.client;import javax.swing.*;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;public class jieshouThread extends Thread{Socket socket;JTextArea jTextArea;DataInputStream dataInputStream;public jieshouThread(Socket socket, JTextArea jTextArea) throws IOException {this.socket = socket;this.jTextArea = jTextArea;this.dataInputStream=new DataInputStream(socket.getInputStream());}@Overridepublic void run() {while (true){String message1=null;try {message1=dataInputStream.readUTF();jTextArea.append(message1);} catch (IOException e) {e.printStackTrace();}}}
}
package com.ffyc.chatroom.client;public class ClientRun {//启动客户端public static void main(String[] args) {new LoginFrame();}
}

网络多人聊天室1.0 群聊相关推荐

  1. Python实现网络多人聊天室

    网络多人聊天室 相关连接:Python实现网络图形化界面多人聊天室 文件结构: chatroom ├── client.py  # 客户端代码 ├── language.py  # 语言文件 ├── ...

  2. 基于netty的在线聊天室,支持群聊和私聊——【一】基本功能介绍和nginx配置

    netty虽然可以实现聊天室的功能.但完整的做下来,还是要自己去封装很多东西,尤其是客户端和服务器通信的数据格式,服务端消息派发器的设计.这一点就比spring 的websocket over sto ...

  3. SpringBoot与webSocket实现在线聊天室——实现私聊+群聊+聊天记录保存

    SpringBoot与webSocket实现在线聊天室--实现私聊+群聊+聊天记录保存 引用参考:原文章地址:https://blog.csdn.net/qq_41463655/article/det ...

  4. Java聊天室——实现多人聊天、私聊、群聊

    客户端 package project.java; //客户端 //输入.输出流分别为处于一个线程import java.io.IOException; import java.io.PrintStr ...

  5. Netty+Android搭建一个简易聊天室(实现群聊和私聊)

    零,前言 JRBM项目中无论是好友私聊,公开聊天室,还是比赛平台都需要用到长连接,之前没有接触过网络通信等知识,更别说框架了,因此直接上手netty确实有些困难,在前期主要是在b站上看(https:/ ...

  6. javaWeb实现聊天室(私聊+群聊)

    写在前面 近几天,迎来了第一个小项目,不做不知道,一做吓一跳.好多知识都掌握的不够扎实,看似会了,但其实似懂非懂,不能真正掌握原理,导致使用起来错误百出.而且深深体会到,知识只有到用时方恨少,一个简单 ...

  7. android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能

    1.API地址:点击打开链接 2.openfire,spark下载:点击打开链接 3.效果图 4.引用的JAR: compile files('libs/fscontext.jar') compile ...

  8. Go语言实战:多人聊天室V2.0-欧阳桫-专题视频课程

    Go语言实战:多人聊天室V2.0-117人已学习 课程介绍         1.0版本基于Go语言的TCP通信实现了基本聊天功能: 2.0版本实现群聊系列功能,包括:建群.申请加群.群主审核.查看群信 ...

  9. 在线聊天室的消息单聊的实现——springboot整合WebSocket(二)

    一.声明 项目的搭建请大家移步到:在线聊天室的消息群聊的实现--springboot整合WebSocket(一) 单聊的实现是在群聊项目上进行延申改造的. 二.引入依赖 <dependency& ...

  10. NIO网络编程实战之简单多人聊天室

    NIO网络编程实战 利用NIO编程知识,实现多人聊天室. 1. NIO编程实现步骤 第一步:创建Selector 第二步:创建ServerSocketChannel,并绑定监听端口 第三步:将Chan ...

最新文章

  1. 【Spring】基于注解的IOC案例
  2. 20151102adonet2
  3. maven2完全使用手册
  4. 室内空气流动原理图_家庭新风系统示意图 新风系统运行原理介绍
  5. wifi弱口令检查(2)
  6. Android与IOS异同点对照(1)------ 显示
  7. ajax json的参数,java ajax json参数
  8. C程序设计语言现代方法07:基本类型
  9. Python 标准库 —— os 路径(os.path)
  10. 1概率论与数理统计_浙江大学B站
  11. zebra(斑马)PDA扫码uniapp程序小demo
  12. Java中Math类常用方法
  13. linux用户及组管理实训,实训 Linux下用户和组的管理和权限命令操作.doc
  14. 无心剑英译许巍《温暖》
  15. ROS学习笔记(2)——ROS通信机制
  16. Django框架学习——4—(DTL模板标签、模版常用过滤器、模版结构优化、加载静态文件)
  17. vip邮箱账号格式和普通邮箱区别是什么呢?
  18. 盘点华为“天才少年”中的神仙女孩纸~
  19. AMiner发布:2022年人工智能全球最具影响力学者榜单AI 2000
  20. 一个全国500强企业的老板是如何关爱员工的

热门文章

  1. 完美解决win7作为虚拟机无法复制粘贴共享文件的问题
  2. SpringCloud 与 SpringBoot 微服务 架构 | 面试题及答案详解
  3. MFC Windows 程序设计[二十一]之树形控件
  4. HTML期末学生大作业-最新QQ音乐、网易云音乐、酷狗音乐、虾米音乐、咪咕音乐网站html+css+javascript
  5. Ubuntu 系统 代码比对工具Meld Diff 下载与使用介绍
  6. hash函数的构造方法
  7. Linux系统firewalld防火墙的应用实操(禁止屏蔽海外国外IP访问)
  8. python中scipy库的导入与函数调用方法_python的scipy库安装成功,导入scipy或其函数时却报错的问题...
  9. 漫画网站java_基于jsp的漫画网站-JavaEE实现漫画网站 - java项目源码
  10. 黑客攻防实战入门(第三版)