前言
项目需要和第三方厂商的服务需要用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消息群发内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!