webSocket-簡單的服務端定時推送以及重連
阿新 • • 發佈:2018-12-14
本文章是對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 { //儲存連線ip ArrayList<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); } @Override public 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() { @Override public 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(); } } @Override public 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; } } } } }
最後:可能會出現亂碼,待解決中,會面完善會及時補上。