webSocket-简单的服务端定时推送以及重连
来源:互联网 发布:php 推送代码 编辑:程序博客网 时间:2024/05/23 02:23
本文章是对webSocket的学习,在使用webSocket进行客户端-服务端的交互。
参考文章: Java基于Socket的简单推送,在文章在服务端 输入后回车 ,可进行对客户端的信息发送,同时进行回馈。
以下为自行改进:服务端定时推送信息到客户端,可根据自行需要进行调整。
说明:jdk1.8,在定时的选择,是服务端或者客户端断开可以重新连接。
Server:
package demo4;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class MyPushServer {//存储连接ipArrayList<Socket> sockets = new ArrayList<Socket>();//定时器private ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();//计数private static int i=1;//主程序public static void main(String[] args) {MyPushServer myPushServer = new MyPushServer();try {myPushServer.start();} catch (IOException e) {e.printStackTrace();}}//程序运行public void start() throws IOException {@SuppressWarnings("resource")ServerSocket serverSocket = new ServerSocket(4000);System.out.println("服务启动成功···");while (true) {//长启动Socket socket = serverSocket.accept();System.out.println("server started... http:/"+ socket.getLocalAddress() + ":" + socket.getPort());System.out.println(socket.getLocalSocketAddress() + ":"+ socket.getLocalPort());sockets.add(socket);//添加ip列表if(i == 1){//保证只需起来一次synchronized (ServerSocket.class) {ServerThread serverThread = new ServerThread();serverThread.start();}}i++;}}//线程任务class ServerThread extends Thread {private BufferedReader reader;private BufferedWriter writer;private BufferedReader read;public ServerThread() {Runnable runnable = new Runnable() { public void run() { //发送内容-流 String str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());InputStream inputStream = new ByteArrayInputStream(str.getBytes());reader = new BufferedReader(new InputStreamReader(inputStream)); } }; // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间 // 第一次执行间隔为10毫秒,随后1000毫秒执行循环 service.scheduleAtFixedRate(runnable, 10, 1000, TimeUnit.MILLISECONDS); }@Overridepublic void run() {String content = null;//发送内容String getContent = null;//返回内容while (true) {try {if ((content = reader.readLine()) != null) {for (Socket socket : sockets) {System.out.println("socket:"+socket);try{ socket.sendUrgentData(0xFF); //验证连接是否断开,以忽悠为一个字节的发送进行验证 writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(content); writer.newLine(); writer.flush();//发送 read = new BufferedReader(new InputStreamReader(socket.getInputStream())); if((getContent = read.readLine()) != null) { System.out.println(getContent); }}catch(Exception ex){ sockets.remove(socket);//移除断开的连接continue;} }}} catch (Exception e) {e.getStackTrace();}}}}}
Client
package demo4;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;import java.util.Timer;import java.util.TimerTask;public class MyPushClient {private Socket socket;public static void main(String[] args) {startConn();}/** * 长连接(可断线重连) * @Title: startConn * @Description: TODO(这里用一句话描述这个方法的作用) * @param: * @return: void * @throws */public static void startConn() {Timer timer = new Timer();TimerTask task = new TimerTask() {@Overridepublic void run() {MyPushClient myPushClient = new MyPushClient();try {myPushClient.start();timer.cancel();System.out.println("连接成功!");} catch (Exception e1) {System.out.println("连接失败,重新连接中···");}}};long delay = 0;long intevalPeriod = 1 * 1500;timer.scheduleAtFixedRate(task, delay, intevalPeriod);}/** * 开始连接 * @Title: start * @Description: TODO(这里用一句话描述这个方法的作用) * @param: @throws IOException * @return: void * @throws */public void start() throws IOException {socket = new Socket("10.200.47.222", 4000);System.out.println("server connection..");ClientThread clientThread = new ClientThread();clientThread.start();}/** * 连接线程-事件 * @ClassName: ClientThread * @Description:TODO(这里用一句话描述这个类的作用) * @author: [zhu] * @date: 2017年6月12日 下午4:59:35 */class ClientThread extends Thread {private BufferedReader reader;private BufferedWriter writer;public ClientThread() {try {reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));} catch (IOException e) {e.printStackTrace();}}@Overridepublic void run() {String content = null;while (true) {try {if ((content = reader.readLine()) != null) {System.out.println(content);writer.write("收到消息");writer.newLine();writer.flush();}} catch (IOException e) {// 断线重连startConn();break;}}}}}
最后:可能会出现乱码,待解决中,会面完善会及时补上。
阅读全文
0 0
- webSocket-简单的服务端定时推送以及重连
- flex定时重连服务端
- websocket 断线重连
- websocket重连机制方案
- 客户端切换网络下WebSocket重连的后台实现
- 实现一个简单的服务端推送方案
- Android多媒体应用开发系列(二) 项目重构以及连拍和定时自动拍照的实现
- 转载: Android多媒体应用开发系列(二) 项目重构以及连拍和定时自动拍照的实现
- 推送服务的心跳与断线重连
- Netty websocket 实现服务端推送消息
- 定时重连adsl的脚本,预防对方禁ip
- 初探和实现websocket心跳重连
- 初探和实现websocket心跳重连
- 初探和实现websocket心跳重连
- java websocket实现简单的即时通讯 消息推送
- 基于okhttp和RxJava封装的自动重连的WebSocket
- 实现一个简单的服务端推送方案-实例篇Polling
- 实现一个简单的服务端推送方案-实例篇Push
- Android Material Design 之 Snackbar
- Git 问题整理
- WPF绘制五子棋盘
- 在枚举中使用位移运算,来判断层叠块
- Caused by: redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected m
- webSocket-简单的服务端定时推送以及重连
- Flutter实战一Flutter聊天应用(七)
- yii2 form组件
- 《将博客搬至CSDN》
- iNOC产品部-杨辉三角的变形(第二种方法也可以通过,测试数据太弱,n>10000就会爆的)
- Ubuntu 16.04 源码安装 opencv 3.2.0
- JAVA开发环境配置
- C# 获取某个目录的父目录
- java,jxl.jar,如何让Excel表格设置密码