Java利用TCP实现服务端向客户端消息群发的示例代码

 更新时间:2022年08月26日 09:21:00   作者:洛阳泰山  
这篇文章主要为大家详细介绍了Java如何利用TCP协议实现服务端向客户端消息群发功能,文中的示例代码讲解详细,需要的可以参考下,希望对你有所帮助

前言 

项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连、宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信。研究测试之后整理如下代码实现。因为发现客户端重启后,对于服务端来说原来的客户端和服务端进程进程已经关闭,启动又和服务端新开了一个进程。所以实现原理就可以通过服务端向客户端群发实现,断开重新连接通讯。

代码 

tcp服务端代码

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
 
public class HttpSocketServer {
    public static void main(String[] args) {
        try {
            ServerSocket server=new ServerSocket(9020);
            while (true){
                Socket client=server.accept();
                System.out.println("进入了1个客户机连接:"+client.getRemoteSocketAddress().toString());
                ServerThread st = new ServerThread(client);
                st.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}

ServerThread 线程类

import java.io.*;
import java.net.Socket;
 
/**
 * 客户机   线程 ——自动执行run
 * @author Lenovo
 */
public class ServerThread extends Thread{
 
    private Socket client;
 
    /**
     * 方法描述: 用有参构造  接收主函数那边传来的 客户机
     */
    public ServerThread(Socket client) {
        this.client=client;
    }
 
 
    @Override
    public void run() {
        try {
            processSocket();//调用你想执行的 使线程启动时在run方法开始执行
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
 
    /**
     * 调用以上方法
     */
    public void processSocket() throws IOException {
        //加入集合 便于服务器群发
        TcpTool.addSocket(client);
    }

TcpTool 消息群发工具类 

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 聊天工具类
 * @author tarzan
 */
public class TcpTool {
 
    private static List<Socket> clientList=new ArrayList<Socket>();
 
    /**
     * 便于 验证成功后  加入客户机
     * @param socket
     */
    public static void addSocket(Socket socket) {
        clientList.add(socket);
    }
 
    /**
     * 群发=遍历list中的all元素, 对每个元素 写出
     * @param msg
     * @throws IOException
     */
    public static void sendAll(String msg){
        for (int i = 0; i <clientList.size(); i++) {
            Socket client = clientList.get(i);
            if(clientIsClose(client)){
                delSocket(client);
                i--;
                continue;
            }
            try {
                OutputStream ops =  client.getOutputStream();
                ops.write((msg+"\r\n").getBytes());
                ops.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        }
    }
 
    /**
     * 判断是否断开连接,断开返回true,没有返回false
     * @param socket
     * @return
     */
    public static Boolean clientIsClose(Socket socket){
        try{
            //发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信
            socket.sendUrgentData(0xFF);
            // 发送一个数据包, 如果通信正常就不会报错.  没有报错说明没有关闭., 返回false
            return false;
        }catch(Exception se){
            return true;
        }
    }
 
 
    /**
     * 下线时删除
     * @param socket
     */
    public static void delSocket(Socket socket){
        clientList.remove(socket);
    }
 
}

Tcp客户端代码

import org.springblade.core.tool.utils.StringUtil;
 
import java.io.*;
import java.net.Socket;
 
/**
 * @author tarzan
 */
public class HttpSocketClient {
    public static void main(String[] args) throws IOException {
        Socket client=new Socket("127.0.0.1",9020);
        while (true) {
            try {
                if (!clientIsClose(client)) {
                    InputStream is=client.getInputStream();
                    BufferedReader reader=new BufferedReader(new InputStreamReader(is));
                    String text=reader.readLine();
                    if(StringUtil.isNotBlank(text)){
                        System.out.println("来自服务端的消息:"+text);
                    }
                }else{
                    try {
                        //断开5秒后重新连接
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    client=new Socket("127.0.0.1",9020);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
    }
 
    public static Boolean clientIsClose(Socket socket){
        try{
            //发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信
            socket.sendUrgentData(0xFF);
            // 发送一个数据包, 如果通信正常就不会报错.  没有报错说明没有关闭., 返回false
            return false;
        }catch(Exception se){
            return true;
        }
    }

运行一个服务端,启动多个客户端进行测试。

控制台输出

以上只是实现的最简单的demo,服务端,因为服务端和客户端都需要不断监听彼此通信,发送消息时候,需要另起一个线程,调用TcpTool工具类想客户端群发消息。

到此这篇关于Java利用TCP实现服务端向客户端消息群发的示例代码的文章就介绍到这了,更多相关Java TCP消息群发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java常见log日志的使用方法解析

    java常见log日志的使用方法解析

    本文主要介绍了java常见log日志的使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java设计模式中代理模式应用详解

    Java设计模式中代理模式应用详解

    代理模式(Proxy Parttern)为一个对象提供一个替身,来控制这个对象的访问,即通过代理对象来访问目标对象。本文将通过示例详细讲解一下这个模式,需要的可以参考一下
    2022-11-11
  • Docker容器使用宿主机上的mongod/redis等服务详解

    Docker容器使用宿主机上的mongod/redis等服务详解

    这篇文章主要介绍了Docker容器使用宿主机上的mongod/redis等服务详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Spring EnableAsync注解异步执行源码解析

    Spring EnableAsync注解异步执行源码解析

    这篇文章主要为大家介绍了Spring EnableAsync注解源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java中的随机数Random

    Java中的随机数Random

    这篇文章主要介绍了Java中的随机数Random,关于随机数的介绍不设置随机数种子,你每次随机抽样得到的数据都是不一样的。设置了随机数种子,能够确保每次抽样的结果一样,下面来了解具体的详细内容介绍吧
    2022-03-03
  • 解析Mybatis的insert方法返回数字-2147482646的解决

    解析Mybatis的insert方法返回数字-2147482646的解决

    这篇文章主要介绍了解析Mybatis的insert方法返回数字-2147482646的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 解决Idea查看源代码警告Library source does not match the bytecode for class XXX问题

    解决Idea查看源代码警告Library source does not mat

    在使用IDEA开发时,遇到第三方jar包中的源代码和字节码不一致的问题,会导致无法正确打断点进行调试,这通常是因为jar包更新后源代码没有同步更新造成的,解决方法是删除旧的jar包,通过Maven重新下载或手动下载最新的源代码包,确保IDE中的源码与字节码版本一致
    2024-10-10
  • JAVA使用爬虫抓取网站网页内容的方法

    JAVA使用爬虫抓取网站网页内容的方法

    这篇文章主要介绍了JAVA使用爬虫抓取网站网页内容的方法,实例分析了java爬虫的两种实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • SpringBoot+Redis实现分布式缓存的方法步骤

    SpringBoot+Redis实现分布式缓存的方法步骤

    在高并发的分布式的系统中,缓存是提升系统性能的重要手段,本文主要介绍了SpringBoot+Redis实现分布式缓存的方法步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 剑指Offer之Java算法习题精讲数组与二叉树

    剑指Offer之Java算法习题精讲数组与二叉树

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03

最新评论