Java网络编程,模拟QQ群聊功能

一、网络编程知识点简介:

1.C/S架构:Client客户端/Server服务器:

  • 涉及到的应用:桌面的应用软件,QQ,王者荣耀
  • 涉及到的技术:Socket网络编程

2.网络:

各个孤立的工作站或主机相连在一起,从而达到资源共享和通信的目的

2.1 网络分为局域网和广域网:

局域网:
  1. 在局域网里可以实现数据的共享
  2. 优点:规模小,容易搭建,传输速度快
  3. 比如:公司的局域网,学校宿舍里的网络
广域网:
  1. 因特网就是世界范围内最大的广域网(WWW)

3.网络协议:

  1. ****TCP(Transmis Control Protocol,传输控制协议)—>(面向连接)
  2. ****UDP(User Datagram Protocol,用户数据报协议)—>(面向非连接)

4.端口和套接字:

  1. 端口(port):可以认为是设备与外界通信交流的出口,范围是0-65535之间的整数
  2. Java提供了IP地址的封装类InetAddress,它位于java.net包中,主要封装ip地址

二、题目要求:

实现QQ群聊功能:

  • 客户端之间的聊天,本质是客户端发送一条消息后,由服务器转发到另外的所有客户端

三、简述步骤:

  • 1.在服务器TCPServer类中定义List集合用来存放所有连接进来的客户端
  • 2.ClientThread的run方法中,当构建好PrintWriter对象后,将对象加入到List集合中
  • 3.在接收客户端消息的地方,调用sendMsg方法,将消息发送给除了自己以外的所有的客户端
  • 4.完成sendMsg方法

四、代码实现:

1.创建客户端类:

1.1 封装打开客户端的方法
public class TCPClient01 {/** 封装打开客户端的方法*/public void open() {try {//创建客户端,并连接服务器Socket client = new Socket("localhost",9999); System.out.println("连接服务器成功!");//获取客户端输入流的对象InputStream is = client.getInputStream();//创建并启动读取服务器发送消息的线程new ReadFromServer(is).start();//获取客户端输出流对象OutputStream os = client.getOutputStream();//创建并启动向服务器发送消息的线程new WriteToServer(os).start();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {TCPClient01 client = new TCPClient01();client.open();}
}
1.2 封装读取服务器发送消息的线程:
class ReadFromServer extends Thread{//封装服务器发送过来消息的输入流InputStream is;public ReadFromServer(InputStream is) {this.is = is;}//重写run方法@Overridepublic void run() {//使用BufferedReader读取服务器的消息BufferedReader br = new BufferedReader(new InputStreamReader(is));String line = null;try {//开始读取while((line=br.readLine())!=null){System.out.println(line);}//关流br.close();} catch (IOException e) {e.printStackTrace();}}
}
1.3 封装客户端向服务器发送消息的线程:
class WriteToServer extends Thread{OutputStream os;//客户端向服务器发送消息的输出流public WriteToServer(OutputStream os) {super();this.os=os;}//重写run方法@Overridepublic void run() {//创建键盘扫描器Scanner key = new Scanner(System.in);//写入消息PrintWriter pw = new PrintWriter(os);while(true) {//接收用户输入的内容String line = key.nextLine();//写入pw.println(line);//强制刷新pw.flush();}}}

2.创建服务器类:

2.1创建并启动服务器的方法:
public class TCPServer01 {//以客户端的昵称作为key值,以发送的消息作为value//定义一个变量Map<String,PrintWriter> allout;/** 创建并启动服务器的方法*/public void start() {//初始化变量allout = new HashMap<String,PrintWriter>();try {//创建服务器ServerSocket server  = new ServerSocket(9999);System.out.println("服务器启动成功,等待用户接入...");//创建while循环,保证服务器一直开启并且一直等待客户端连接while(true) {//调用accept方法Socket client = server.accept();//得到连接的客户端的IP地址System.out.println("有客户接入,客户的IP为:"+client.getInetAddress());//启动线程new ClientThread(client,allout).start();}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {TCPServer01 server = new TCPServer01();server.start();}
}
2.2 向客户端发送消息,接收客户端发送过来的消息
class ClientThread extends Thread{//连接到服务器端的客户端Socket client;Map<String,PrintWriter> allout;   public ClientThread(Socket client, Map<String, PrintWriter> allout) {super();this.client = client;this.allout = allout;}@Overridepublic void run() {try {//向客户端发送数据//获取输出流对象OutputStream out = client.getOutputStream();PrintWriter pw = new PrintWriter(out);//发消息pw.println("~~~欢迎来到云轩棋牌聊天室~~~~");pw.println("请先输入您的聊天昵称:");//强制刷新pw.flush();      //接收客户端发送的消息InputStream in = client.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));           //获取昵称String name = br.readLine();         //将客户端输出流对象加入到集合中allout.put(name, pw);          String line = null;while((line=br.readLine())!=null){            //向其他所有的客户端发送消息,pw代表当前自己sendMsg(name+"说:"+line,pw);}//关流br.close();} catch (IOException e) {e.printStackTrace();}}
2.3 向其他所有的客户端发送消息的方法:
private void sendMsg(String line, PrintWriter pw) {//遍历map集合Set<String> names = allout.keySet();for(String name:names){//根据key获取到对应的value值PrintWriter p = allout.get(name);  if(p != pw){                       p.println(line);//刷新p.flush();}}}}

五、运行结果展示:

*温馨提示:运行时,首先启动服务器,然后启动客户端哟


结语:技术无他,唯有熟尔。知其然,也知其所以然;不要着急,你想要的,岁月都会给你。

Java网络编程,模拟QQ群聊功能相关推荐

  1. Java项目模拟QQ群聊和私聊(网络编程+多线程)

    [文末获取资源] 前几天学习了多线程,最近在学习网络编程,了解了UDP之后又学习了TCP,听一下大佬说,要看看你这两个东西掌握的怎么样,最好的办法就是写一个模拟QQ群聊和私聊,经过这几天的学习,以及不 ...

  2. 多线程+SOCKET编程实现qq群聊的服务端和客户端

    多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...

  3. 使用java网络编程模拟简单网络即时通信

    使用java网络编程模拟简单网络即时通信 通信流程图: 解析: 1.在上图中我们可以看出对于任何一个客户端,都由两部分构成,发送端和接收端(分别由两个线程来维系) 2.客户端在每一次请求链接时都会轮询 ...

  4. 基于python实现类似qq群聊功能

    这篇文章主要记录了自己学习python时学习到的使用python来实现类似qq群聊的功能,整个项目分为服务器端和客户端两个部分,具体的实现如下: 一.具体代码 1.服务器端(Server.py) im ...

  5. java使用socket网络编程实现qq互聊(UPD简单版本)

    JAVA初学者.勿喷. eclipse稍微有点难用,关程序是在Console里面,要是没开出来并且死循环的话电脑cpu直接拉满了. 而且进程的关闭是输入指定的"再见"才关闭多线程, ...

  6. (六)Netty网络编程应用实例-群聊系统

    实例要求: 编写一个NIO群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 实现多人群聊 服务器端:可以监测用户上线,离线,并实现消息转发功能 客户端:通过channel可以无阻塞发送消息给 ...

  7. 基于QML模拟QQ群聊窗口

    据说最近要开发简单的IM工具,于是兴起,研究了下QQ聊天窗口,大概模拟了一下群聊的聊天显示界面,遂与大家分享之 画面粗糙还望海涵 图片有点大,原理基本就是使用listview来显示每一条记录,别人的记 ...

  8. PyQt5+ Python3 模拟QQ群聊

    尊重原创,原文链接 关于PyQt5+Python3开发环境安装可以参考上篇.这里实现的是一种群聊工具,socket类使用的是Qt的TcpSocket, TcpServer 类:线程类使用的QTread ...

  9. NIO网络编程应用实例——群聊系统

    GroupChatServer.java package com.atguigu.nio.groupchat;import java.io.IOException; import java.net.I ...

最新文章

  1. 几张图帮你理解 docker 基本原理及快速入门
  2. 微型计算机的层次结构,计算机系统层次结构微程序级
  3. hibernate_和ORM的关系
  4. html input type=file 文件上传; 图片上传; 图片闪烁
  5. Java设计模式笔记(7)适配器模式
  6. 不会讲故事,怎么带团队(用故事简化沟通,提升团队效率)--读后感
  7. axure中继器案例
  8. 抽象代数笔记-环、域、扩域、伽罗瓦理论
  9. win10 kms activator
  10. python 拆分excel单元格内容_Excel拆分单元格与把一个单元格内容拆分到多个单元格...
  11. MySQL:BLOB/TEXT Column Used in Key Specification Without a Key Length
  12. python爬虫 scrapy+selenium+webdriver实现鼠标滑动破解阿里云盾快验证
  13. 重启Android手机代码
  14. 第三周 目标检测(Object detection)
  15. C语言中fscanf()函数的用法介绍
  16. 云米美国上市雷军系持股40% 陈小平:重新定义家的未来
  17. 今天遭到鄙视了。突然感觉自己昏昏沉沉的过日子 究竟不是个事 自己得努力了!~!
  18. DJI的核心竞争力是什么?
  19. 教你一键翻译中文转英文
  20. Leetcode PHP题解--D53 566. Reshape the Matrix

热门文章

  1. 安装win10系统时提示只能安装到GPT分区解决方法
  2. 【U3D】人物触发物体显示界面(游戏开始/游戏结束/碰撞金币等)
  3. 无约束优化问题之Hooke-Jeeves法(模式搜索法)
  4. 头歌大数据技术第二关 大数据从入门到实战 - 第2章 分布式文件系统HDFS
  5. atop用法_Linux atop 命令 command not found atop 命令详解 atop 命令未找到 atop 命令安装 - CommandNotFound ⚡️ 坑否...
  6. xp系统steam无法连接到更新服务器,还在用XP?明年可能连steam你都启动不了!
  7. Java开发教程!三面蚂蚁金服(交叉面)定级阿里P6
  8. 阿里搜索和推荐关于效率稳定性的思考和实践
  9. 注册CSDN之后的第一条PIAO客
  10. 使用 Ansible 统计服务器资源利用率