使用说明

这个代码是模拟一个简单的QQ,微信群聊,首先运行服务端代码,在运行客户端,每运行一次客户端,都会创建一个用户在聊天室中模拟发言。(注:服务端要一直处于开启状态,不能关闭)

客户端代码

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {/** 在整个客户端类中都会使用到Socket对象,所以生命成属性。* Socket内部封装了TCP协议,可以完成安全可靠的数据传输。* * 客户端向服务端发送数据时,需要使用输出流进行操作。*/private Socket socket;/*** 客户端无参构造器* 目的:用于创建客户端对象时,对socket属性进行初始化* */public Client() {try {System.out.println("开始连接");/** Socket实质是用于描述IP地址和端口号* 当创建Socket对象时需要调用两个参数的构造器方法* 参数一:需要指定IP(服务端的IP地址)* 参数二:需要指定端口号(服务端的端口号)*/socket = new Socket("localhost", 8899);System.out.println("连接服务端成功");} catch (UnknownHostException e) {     e.printStackTrace();} catch (IOException e) {           e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 向服务端写出数据的方法*/public void start() {/** 如果需要发送消息,要使用socket对象获取输出流* getOutputStream()方法的返回值要求返回一个OutputStream*/try {//创建接受服务端的消息线程,并添加任务序列ServerHandler serverHandler = new ServerHandler();Thread thread = new Thread(serverHandler);thread.start();OutputStream os = socket.getOutputStream();//创建字符转换流对象OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");//创建缓冲字符输出流对象BufferedWriter bw = new BufferedWriter(osw);//创建具备自动行数新功能的字符输出流PrintWriter pw = new PrintWriter(bw, true);//通过控制台接受客户端消息  Scanner scanner = new Scanner(System.in);while (true) {                String message = scanner.nextLine();pw.println(message);}} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {//创建客户端对象Client client = new Client();client.start();}/*** 用于处理服务端发送过来的数据的读取操作*/class ServerHandler implements Runnable {@Overridepublic void run() {try {InputStream is = socket.getInputStream();//创建字符转换流对象InputStreamReader isr = new InputStreamReader(is,"utf-8");//创建缓冲字符输入流对象BufferedReader br = new BufferedReader(isr);//读取数据,按行进行读取String message;while ((message = br.readLine()) != null) {System.err.println(message);}} catch (Exception e) {e.printStackTrace();}}}
}

服务端代码


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class Server {/** 声明服务端ServerSocket对象*/private ServerSocket serverSocket;/** 定义一个输出流数组,保存的是指向各个客户端的输出流对象*/private PrintWriter[] allout = {};/*** 服务端无参构造器* 目的:用于创建服务端对象时,对serverSocket属性进行初始化* */public Server() {try {System.out.println("服务端正在启动");serverSocket = new ServerSocket(8899);System.out.println("服务端启动完毕");} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 服务端接收客户端消息的方法*/public void start() {/** Socket accept()方法是一个阻塞方法,* 循环等待客户端连接,如果没有客户端连接就一直在这等着。*/try {while (true) {System.out.println("等待接收客户端连接");Socket socket = serverSocket.accept();System.out.println("一个客户端已经连接");/** 创建任务序列对象* 创建线程对象并添加任务序列* 开启线程* 目的:等待客户端连接以后,可以开启一条线程,* 在新的线程中用于处理客户端连接后的一些列操作*/ClientHandler clientHandler = new ClientHandler(socket);Thread thread = new Thread(clientHandler);thread.start();}} catch (IOException e) {         e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {//创建服务端对象Server server = new Server();server.start();}/*** 用于处理客户端请求的内部类,* 主要的职责是充当线程的任务序列,* 在任务序列中,主要做获取输入流对象,循环判断,* 及其信息输出的操作。* @author Administrator**/class ClientHandler implements Runnable{//客户端发送过来的Socket对象Socket socket;//客户端的地址信息String host;public ClientHandler(Socket socket) {this.socket = socket;this.host = socket.getInetAddress().getHostAddress();}@Overridepublic void run() {//字符输出流局部变量PrintWriter pw = null;try {/** 如果需要从服务端打印客户端传输的信息,* 需要从Socket中获取输入流*/InputStream is = socket.getInputStream();//创建字符转换流对象InputStreamReader isr = new InputStreamReader(is,"utf-8");//创建缓冲字符输入流对象BufferedReader br = new BufferedReader(isr);/** 获取Socket中的输出流对象,用于给客户端写出数据*/OutputStream os = socket.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os,"utf-8");BufferedWriter bw = new BufferedWriter(osw);pw = new PrintWriter(bw,true);//将输出流对象添加到allout输出流数组中synchronized (allout) {//对原数进行扩容allout = Arrays.copyOf(allout, allout.length+1);//对数组中的最后一个元素进行赋值allout[allout.length-1] = pw;}//在控制台中打印当前在线人数System.out.println(host+"上线了,当前在线人数为:"+allout.length);//读取数据,按行进行读取String message;while ((message = br.readLine()) != null) {System.err.println(host+"说:"+message);//读取消息以后就向客户端写出synchronized (allout) {//遍历输出流数组,向所有的客户端输出数据for (int i = 0; i < allout.length; i++) {allout[i].println(host+"说了:"+message);}}}}  catch (Exception e) {  /** 如果停掉客户端会发生异常,可以在当前的catch块中* 进行处理删除发送给当前已经停止掉的客户端的输出流对象*/synchronized (allout) {for (int i = 0; i < allout.length; i++) {if (allout[i] == pw) {/** 删除的原则是找到需要移除的输出流对象,* 然后将输出流数组中最后一个输出流对象* 赋值给当前删除的输出流对象的下标位置。* 最后缩容数组*/allout[i] = allout[allout.length-1];allout = Arrays.copyOf(allout, allout.length-1);//结束循环break;}}}} finally {System.out.println(host+"下线了,当前在线人数:"+allout.length);try {//关闭Socket资源socket.close();} catch (IOException e) {}}}}
}

聊天室案例,模仿QQ,微信群聊相关推荐

  1. Java用TCP手写聊天室 可以 私聊版加群聊版

    一:引言 想要私聊必须有规定的格式:@名字:要说的话 二:上码 1.服务端 package com.wyj.talkhome; /** * 实现一个用户可以接发多条消息 * * */ import j ...

  2. 模仿微信群聊管理功能(头像管理效果)

    在社交类应用开发中经常用到群管理功能,来约束访问范围. 本文讲述的是如何实现类似微信群聊时成员管理的UI效果. 先上效果图: (添加状态) (删除状态) (添加成功) UI效果概述: 1. +图标,单 ...

  3. nodejs 结合 wechaty 实现你的微信群聊机器人二(iPad 协议)

    程序员导航站 :艾特网-iiter.cn 开源地址: https://github.com/isnl/wechat-robot-ipad 前言 前段时间写了篇关于使用 nodejs 结合 wechat ...

  4. 《OnlineChat996》基于微信群聊的在线实时通信工具

    项目源码:你和我的畅聊时光 一.主要功能 注册,成为我们的注册会员用户,你将拥有全网唯一的ID. 登录,进入拥有千万好友的畅聊空间. 私聊,你可以选择和任意在线用户进行一次亲密对话. 群聊,只要你想, ...

  5. android微信群聊功能,微信安卓内测更新,这个群聊功能等了8年

    近日,安卓版微信悄然迎来了 8.0.3 内测版更新,本次内测又带来了哪些新功能呢,一起来看看吧. 01 群聊支持键入 @所有人 微信作为国民级应用,而微信群又是微信中的一个重要组成部分." ...

  6. python开发微信群_Python编程:微信群聊程序的开发与进/线程知识汇总(附代码)

    本文承接上篇文章的客户端-服务器聊天对话程序,进一步设计开发了微信群聊的python模拟程序,涉及的python知识点为:Python实战:聊天软件开发与TCP/Socket编程知识汇总(附代码)和 ...

  7. 手把手教你分析微信群聊记录,识别害群之马

    导读:很多朋友加入了很多微信群,作为群中一员,你想知道这个群是否值得留下?而作为群主,你想了解目前这个群是否健康?如果有问题,那么坏了这锅粥的老鼠屎是谁?应该怎样设立群规?本文通过简单的分析给出思路, ...

  8. FluorineFx + Flex视频聊天室案例开发----客户端

    上一篇<FluorineFx + Flex视频聊天室案例开发----服务器端>详细的介绍了如何利用FluorineFx开发一个及时通信的视频聊天室服务器处理程序,并通过Web网站来宿主这个 ...

  9. delphi 企业微信消息机器人_企业微信—群聊机器人

    在企业微信群聊机器人接口对接天气API使用过程中,遇到 过一个问题,就是对于嵌套json数据如何进行嵌套的| 一:"msgtype": "text", curl ...

最新文章

  1. 做 Java 工程师,挺!好!
  2. 他2年拿下博士学位,发表11篇顶会论文!浙大校友李旻辰斩获SIGGRAPH最佳博士论文奖...
  3. python变量详解_Python 变量详解[学习 Python 必备基础知识][看此一篇就够了]
  4. Win10无法修改编辑hosts文件
  5. 通用寄存器的专门用途
  6. iOS开发-动画总结
  7. 移动端python开发_python前端之移动端库、框架及自动化和优化
  8. POJ 2342 (树形DP)
  9. HP Z840 工作站配sSAS Raid 安装 Ubuntu 16.04 系统
  10. 机器学习基石13-Hazard of Overfitting
  11. java编写字符串连接程序注释_Java 注解自动化处理对应关系实现注释代码化
  12. 安卓9.0系统新特性
  13. 为何python不好找工作-为什么说Python不好找工作?原因在这里!
  14. Eclipse建立webservice客户端
  15. Ubuntu 18.04 通过 ufw route 配置网关服务器
  16. Legal or Not
  17. 5V升压8.4V,5V转8.4芯片电路图
  18. java调用matlab绘图_java调用matlab绘图
  19. printf()输出格式
  20. DSP TMS320C5509A 控制DDS AD9854芯片驱动

热门文章

  1. 杂谈~关于踩shit
  2. Hudi--mor表 VS cow表
  3. RocketMQ常见问题-消息重复消费和消息重复的问题
  4. 有光就可以上网?中国工程院院士表示,可见光通信要比5G快10倍!
  5. 记录一下:老衲的py路程 mac下的tkinter小应用
  6. html5导航 按钮,CSS实例:超酷的网站导航按钮
  7. MVG(second)读书笔记-2D射影几何和变换
  8. Windows XP 下如何安装 SQL server 2000 企业版
  9. windows分区整数
  10. 2022年河南省高职单招(职业倾向性)(思想道德素质与法律)考试冲刺试题及答案