Java网络编程:TCP实现群聊功能代码

实现的功能:群聊

具体操作流程的大致思路:

某个客户端发送消息,服务器将该消息转发给其余客户端(除了自己)。
代码一共分两个端(服务器和客户端(其中客户端一共3个代码)),所以一共5个代码(下面有显示代码)。

【1】客户端代码:(三个代码,其中Send和Receive可以看做被被Client使用创建的,分开封装而已)
【2】服务器代码:(一个代码)
【3】一个工具类Utils代码:

(1)Send类的代码:

package chat3;import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;/*** 作用:被MutiClient类用到,是客户端用来发送消息的* 具体操作是:客户端读取控制台消息--写入到client的输出流* @author Administrator**/
public class Send implements Runnable {private BufferedReader console;private DataOutputStream dos;private Socket client;private boolean isRunning;private String name;public Send(Socket client,String name) {this.client=client;this.name=name;console=new BufferedReader(new InputStreamReader(System.in));try {dos=new DataOutputStream(client.getOutputStream());sendMsg(name);//发送名字isRunning=true;} catch (IOException e) {System.out.println("客户端的send构造器有问题");this.release();}}@Overridepublic void run() {while(isRunning) {//客户端读取控制台消息--写入到client的输出流String msg=ConsoleMsg();if(!msg.equals("")) {sendMsg(msg);}}}private String ConsoleMsg() {//先读取控制台的内容String msg="";try {msg=console.readLine();} catch (IOException e) {System.out.println("客户端的ConsoleMsg有问题");this.release();}return msg;}private void sendMsg(String msg) {//再写入到客户端的输出流里try {dos.writeUTF(msg);dos.flush();//这个一定不能忘记啦} catch (IOException e) {System.out.println("客户端的sendMsg有问题");this.release();}}//释放资源private void release() {//内部类的使用this.isRunning=false;//释放资源意味着该该客户端要停下来Utils.close(dos,client);//自己写的一个工具类Utils}
}

(2)Receive类的代码:

package chat2;import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;/***作用: 被MutiClient类用到,是客户端用来接收服务器反馈的消息的*客户端读取服务器反馈的消息,并显示输出* @author Administrator**/
public class Receive implements Runnable {private DataInputStream dis;private Socket client;private boolean isRunning;public Receive(Socket client) {this.client=client;isRunning=true;try {dis=new DataInputStream(client.getInputStream());} catch (IOException e) {System.out.println("客户端的Receive构造器有问题");release();}}@Overridepublic void run() {while(isRunning) {String msg=receiveMsg();if(!msg.equals("")) {System.out.println(msg);}}}private String receiveMsg() {String msg="";try {msg=dis.readUTF();} catch (IOException e) {System.out.println("客户端的receiveMsg有问题");release();}return msg;}//释放资源private void release() {//内部类的使用this.isRunning=false;//释放资源意味着该该客户端要停下来Utils.close(dis,client);//自己写的一个工具类Utils}
}

(3)Client类的代码:

package chat3;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;/**注意:* 在线聊天室:使用容器实现群聊* 客户端* @author Administrator**/
public class Client {public static void main(String[] args) throws UnknownHostException, IOException {System.out.println("---------------client--------------");BufferedReader br=new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入用户名:");String name=br.readLine();//建立套接字Socket client=new Socket("localhost", 8983);//客户端发送消息(先读取控制台的内容,再写入到客户端的输出流里)new Thread(new Send(client,name)).start();new Thread(new Receive(client)).start();}
}

(4)Server类的代码:

package chat3;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;/**注意:* 在线聊天室:使用容器实现群聊* 服务器* @author Administrator* 需要修改和遍历数据的时候使用list会操作不方便* 问题:为什么加了static,在主函数里面就没错啦?* */
public class Server {//CopyOnWriteArrayList和list用法一样private static CopyOnWriteArrayList<Channel> all=new CopyOnWriteArrayList<Channel>();public static void main(String[] args) throws IOException {System.out.println("----------server----------");//创建服务器ServerSocket server=new ServerSocket(8983);while(true) {//阻塞式等待客户端的连接Socket client=server.accept();System.out.println("一个客户端连接上。。。");Channel c=new Channel(client);all.add(c);//容器管理所有的成员new Thread(c).start();}}//一个客户代表一个Channelstatic class Channel implements Runnable{private DataInputStream dis ;private DataOutputStream dos;private Socket client;private boolean isRunning;//程序是否停下来的标志private String name;public Channel(Socket client) {this.client=client;try {dis = new DataInputStream(client.getInputStream());dos=new DataOutputStream(client.getOutputStream());isRunning=true;//获取名称name=receiveMsg();this.sendMsg(name+"同学,"+"欢迎您的到来");sendOther(this.name+"加入群聊天室",true);} catch (IOException e) {System.out.println("-----1   出问题----");//自己方便观察哪里出问题release();//注意:这里做了修改}}//接收消息(服务器读取客户端发过来的信息)private String receiveMsg() {String msg="";try {msg=dis.readUTF();} catch (IOException e) {System.out.println("-----receive 出问题----");//自己方便观察哪里出问题release();//注意:这里做了修改}return msg;}//发送消息(服务器反馈信息给客户端)private void sendMsg(String msg) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {System.out.println("-----send 出问题----");//自己方便观察哪里出问题release();//注意:这里做了修改}}//发送消息(服务器反馈信息(其实就是服务器读取的当前客户端的消息)给其他所有的客户端(除了当前客户端)private void sendOther(String msg,boolean isSysMsg) {for(Channel other:all) {//服务器把收到的客户端的消息发给其余所有的客户端(除了当前客户端)if(other!=this) {if(isSysMsg) {other.sendMsg(msg);//系统消息}else {other.sendMsg(this.name+":"+msg);//群聊消息}}}}//释放资源private void release() {this.isRunning=false;//释放资源意味着该该客户端要停下来Utils.close(dis,dos,client);//自己写的一个工具类Utilsall.remove(this);//当前客户端退出sendOther(this.name+"离开了聊天室。。。", true);}@Overridepublic void run() {while(isRunning) {//流程:服务器读取客户端消息-服务器发送反馈消息给客户端-释放资源String msg=receiveMsg();//System.out.println("服务器读取到的信息为:"+msg);if(!msg.equals("")) {//sendMsg(msg);sendOther(msg,false);//群聊消息}}//release();//老师这里没有释放}}
}

(5)Utils类的代码:

package chat4;import java.io.Closeable;/*** 自己写一个释放资源的工具类* @author Administrator**/
public class Utils {public static void close(Closeable... targets) {for(Closeable target:targets) {try {if(null!=target) {target.close();}}catch(Exception e){}}}
}

多嘴一句,如果不会运行该代码,自行百度一下,就知道啦!!!很关键。

运行效果如下:


以上就是Java TCP网络编程对于群聊模式功能的简单实现,大家有什么不清楚的,欢迎留言哈(虽然我也很菜的)!!!加油!!!

Java网络编程:TCP实现群聊功能代码相关推荐

  1. Java网络编程:TCP实现群聊私聊代码

    Java网络编程:TCP实现群聊&私聊代码 和上一篇博客差不多,只不过是在群里的基础之上增加了私聊的功能,我们约定,私聊格式为:@xxx:msg 如何实现私聊呢,加入客户端c给服务器发送消息, ...

  2. UDP实现简单的群聊功能代码示例

    以下是UDP实现群聊功能代码示例 在java中,通过两个特定类来实现UDP协议顶层数据报,分别是DatagramPacket和DatagramSocket,其中类DatagramPacket是一个数据 ...

  3. Java网络编程 ---- TCP 网络通信编程

    视频:[零基础 快速学Java]韩顺平 零基础30天学会Java 文章目录 1. Socket 2. TCP 网络通信编程 3. 应用案例 1(使用字节流) 4. 应用案例 2(使用字节流) 5. 应 ...

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

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

  5. java网络编程TCP传输—流操作—拿到源后的写入动作

    在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 1 //获取sock ...

  6. java网络编程--TCP程序设计

    一,本章目标 了解Socket和ServerSocker类的作用 掌握ECHO程序开发 将多线程应用在TCP程序上实现多用户操作 二,具体内容 在java网络程序中,客户端只要符合连接的通讯协议,那么 ...

  7. Java网络编程---TCP通信

    TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信 Java对基于TCP协议的 ...

  8. java网络编程 TCP程序

    在java中,使用Socket完成TCP(传输控制协议)程序开发,使用此类可以方便地建立可靠的,双向的,持续的,点对点通信连接 服务端: ServerSocket    程序段:Socket Serv ...

  9. Java网络编程 - TCP通信

    文章目录 TCP通信 快速入门(一发一收) 编写客户端代码 编写服务器代码 多发多收 多发多收(同时接受多个客户端) 线程池优化 TCP通信 快速入门(一发一收) TCP协议回顾: TCP是一种面向连 ...

  10. 2.Java 网络编程TCP通讯例子 双向发送

    在上篇例子中,存在缺陷 只能允许Client给Server发消息,Server无法发消息给Client端 Client连接成功之后,Server就关闭了 这篇完善上篇的例子 TCP服务端 import ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第13期)
  2. win10安装java1.8开发环境JDK
  3. oracle提高io,【转】Oracle性能优化调整--调整磁盘I/O
  4. 通过一个例子学习Kubernetes里的PersistentVolumeClaim的用法
  5. 小优优(u盘歌曲顺序调整)_电脑从U盘启动,这三种方式你知道吗?
  6. 在 Objective-C 中对 Block 应用 property 时的注意事项
  7. 【数值分析】数值分析的微积分学基础
  8. 程序员到底会不会修电脑?
  9. 深度学习(七十四)半监督Mean teachers
  10. 冰点——收费文档的下载利器
  11. 如何将多个TXT合并成一个TXT,文件名称提取
  12. C语言程序结构的特点
  13. 思科网络设备常用命令
  14. 太阳的光和灯光有什么区别_阳光和灯光
  15. Cinemachine 之简单的相机跟随
  16. 腾讯文档自动填写工具(工具)
  17. 微信小程序识别二维码参数
  18. Blob分析---ball.hdev
  19. office2010和office2016共存,将office2016设置为默认打开的office
  20. 牛客15108 道路建设

热门文章

  1. 在 mysql数据库怎么知道的ip_用户名_密码_数据库_数据库ip怎么查
  2. android模拟器设置静态ip,安卓模拟器多开窗口挂手游切换不同IP防封号技术讲解...
  3. c语言 队列长度,c语言 队列
  4. kali解压deb_Kali下安装网易云音乐
  5. 数字滤波算法——中值滤波
  6. python与乐高ev3结合_乐高Ev3嵌入式系统(Python)的图像识别
  7. matlab pascal函数,pascal常用函数较全
  8. 数学建模学习笔记(六):排队论模型
  9. 一、项目分析(华为项目管理法-孙科炎读书摘要)
  10. BP神经网络模型及梯度下降法