前言

项目需要和第三方厂商的服务需要用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();client.setKeepAlive(true);client.setOOBInline(true);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;}@Overridepublic 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);// 发送一个数据包, 如果通信正常就不会报错.  没有报错说明没有关闭., 返回falsereturn 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);client.setKeepAlive(true);client.setOOBInline(true);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);// 发送一个数据包, 如果通信正常就不会报错.  没有报错说明没有关闭., 返回falsereturn false;}catch(Exception se){return true;}}

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

控制台输出

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

java BIO tcp服务端向客户端消息群发代码教程实战相关推荐

  1. JAVA NIO 异步TCP服务端向客户端消息群发代码教程实战

    前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...

  2. Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

    Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...

  3. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  4. Go语言实现TCP服务端和客户端

    Go语言实现TCP服务端和客户端 Go语言实现TCP通信 TCP协议 TCP服务端 TCP客户端 本文转载自Go语言实现TCP通信 Go语言实现TCP通信 TCP协议 TCP/IP(Transmiss ...

  5. windows Socket编程之TCP服务端与客户端

    在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...

  6. .NET TCP服务端和客户端

    客户端 public class TcpClientHelper{/// <summary>/// 是否连接上/// </summary>public bool Connect ...

  7. python学习随堂笔记—TCP服务端与客户端

    思想: 1. 客户端 向服务端 发起连接 2. 服务端 接到请求,双方建立连接 3. 客户端 向 服务端发消息 4. 服务端 应答客户端 5. 服务端 与客户端循环读写操作 6. 操作完成之后客户端发 ...

  8. android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子

    学习了: android binder - 客户端(java层) 调用 服务端(c++层) 例子 http://blog.csdn.net/ganyue803/article/details/4131 ...

  9. php编写TCP服务端和客户端程序

    From: http://blog.csdn.net/anda0109/article/details/46655301 1.修改php.ini,打开extension=php_sockets.dll ...

最新文章

  1. C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件
  2. Openshift创建Router和Registry
  3. Exchange数据库无法装载的问题
  4. python爬虫 -- 正则表达式 与 Re模块的介绍
  5. 树和而叉查找树的实现
  6. matlab 颜色势能,Matlab在模拟晶面势能分布中的应用
  7. [转]TortoiseSVN客户端重新设置用户名和密码
  8. html5 lang作用,HTML5中的lang属性,zh
  9. discuz集思街淘宝客模板
  10. 消息中间件--RabbitMQ --死信队列
  11. mongodb空间查询java,java查看mongodb集合表空间大小
  12. RS485芯片/RS485通讯芯片/RS485通讯接口芯片UN3485
  13. 深思新推出高性价比智能卡加密锁--魔锐1
  14. Google浏览器删除的书签怎么恢复?
  15. 轻量级网络之GhostNet
  16. Linux安装DBLE
  17. TextView中动态显示某些值
  18. 总结(CFAI,AWB,Denoise2D,Sharpen)
  19. git 源码安装后报错/usr/bin/git: No such file or directory
  20. 使用xib自定义button

热门文章

  1. PyQT5 (四十三) 在 QTableWidget 表格中设置单元格的字体和颜色 的案例
  2. AI笔记: 数学基础之向量组的线性表示与线性相关
  3. 我用源码搭建直播网站
  4. 用 PHP 来刷leetCode 之 三数之和
  5. Python绘制3D图形:Axes3D
  6. 张勇卸任淘宝董事长,戴珊接任;苹果称不送充电器已节省55万吨矿石;Windows彻底告别SMB1传输协议|极客头条
  7. RabbitMQ学习笔记(四)-消息确认机制
  8. CF1647F Madoka and Laziness
  9. 如何把魅族Pro 5刷成Ubuntu手机
  10. 记账的目的和好处是什么