㈠ java 如何實現長連接心跳檢測機制
發心跳包。每隔幾秒就發一個數據包過去,這是通訊常見問題。
可以使用的是pushlet來實現;
普通列表由瀏覽器維護一個長連接,發送請求後,伺服器不以http response的方式返回,而是建立類似管道的途徑,當有更新時,伺服器通過這個管道發送消息,直到頁面關閉後斷開這個鏈接。
另外,如果使用這些框架,那麼在前端(頁面)和後端(服務)都要進行改變,需要視自己的實際情況使用。
㈡ java socket報文通信心跳相關問題
你的伺服器可客戶端都是順序執行,不管怎麼樣,都會瞬間就執行伺服器可客戶端的close,這是不行的,所以當你客戶端要連接伺服器時,這時伺服器已經關閉了,就不能連接了。
首先,你要創建一個線程,時候等待客戶端的連接,並且有一個客戶端來了,就單獨創建一個連接,這樣就能讓很多客戶端同時通訊。
而你的客戶端也是一樣,要時刻保持連接,當監聽到客戶端關閉或退出的時候才能執行clientsocket.close();這樣才能保持與伺服器正常通訊。
㈢ java是否可以實現心跳的程序
java是可以實現心跳的程序的。
心跳顧名思義就是每隔一段時間執行,或者輪詢查詢狀態,可以使用timer來實現,代碼如下:
定時器可以實現
//1000毫秒,固定時間,每隔1秒鍾執行一次actionPerformed方法
javax.swing.Timerclock=newjavax.swing.Timer(1000,newActionListener(){
publicvoidactionPerformed(ActionEvente){
//執行心跳方法
/**...*/
//調用其他方法
/**...*/
}
});
clock.start();
可以獨立用個線程管理,也可以直接寫在主線程中
㈣ java socket 服務怎麼接收心跳數據
我發送一個字元串給伺服器,伺服器會返回給我七條數據,這七條數據是這樣發的:發完第一條馬上發第二條發完二馬上發三也就是說七條不是同時給我的,中間有那麼幾毫秒的時間,現在我要做的是,把這七條數據都接收到,分別截取每一條數據中特定位置的那個字元
㈤ mina 心跳機制 ieRequest isResponse畢竟什麼時候調用
mina 心跳機制 ieRequest isResponse到底什麼時候調用
上下文設置:
伺服器端基於Mina開發,心跳包25秒發一次0D+0A,客戶端收到後,回0D-0A
因為客戶端設置了60秒一次心跳包,所以心跳包有伺服器端先發起。
客戶端心跳過濾器代碼:(伺服器端代碼就不貼了,差不多的)
package com.mina.client;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.keepalive.KeepAliveFilter;
import org.apache.mina.filter.keepalive.KeepAliveMessageFactory;
import org.apache.mina.filter.keepalive.;
public class MyKeepAliveFilter extends KeepAliveFilter {
public MyKeepAliveFilter() {
super(new KeepAliveMessageFactoryImpl(), IdleStatus.BOTH_IDLE, new ExceptionHandler(), 60, 70);
this.setForwardEvent(false); //此消息不會繼續傳遞,不會被業務層看見
}
}
class ExceptionHandler implements {
public void keepAliveRequestTimedOut(KeepAliveFilter filter, IoSession session) throws Exception {
System.out.println("心跳超時");
session.close(true);
}
}
class KeepAliveMessageFactoryImpl implements KeepAliveMessageFactory {
private static final byte int_req = '+'; // 2B
private static final byte int_rep = '-'; // 2D
private static final IoBuffer KAMSG_REQ = IoBuffer.wrap(new byte[]{0x0D, '+', 0x0A});
private static final IoBuffer KAMSG_REP = IoBuffer.wrap(new byte[]{0x0D, '-', 0x0A});
/**
* 此方法為發心跳包,發+
*/
@Override
public Object getRequest(IoSession arg0) {
System.out.println();
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " 發心跳包+:" + KAMSG_REQ.plicate());
return KAMSG_REQ.plicate();
}
/**
* 收到對方的心跳包後,此方法回心跳包,回-
*/
@Override
public Object getResponse(IoSession arg0, Object arg1) {
System.out.println();
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " 回心跳包-:" + KAMSG_REP.plicate());
return KAMSG_REP.plicate();
}
/**
* 是否是心跳請求包,不管是對方的還是自己的
*/
@Override
public boolean isRequest(IoSession session, Object message) {
if(!(message instanceof IoBuffer)) {
return false;
}
IoBuffer realMessage = (IoBuffer)message;
System.out.println();
if(realMessage.limit() != 3) {
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isRequest limit不等於3,RETURN FALSE: message長度:" + realMessage.limit() + " : " + realMessage);
return false;
} else {
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isRequest limit等於3, message長度:" + realMessage.limit() + " : " + realMessage);
}
if (realMessage.remaining() != 3) {
return false;
}
byte[] b = new byte[3];
realMessage.get(b);
boolean result = (b[1] == int_req);
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isRequest 判斷是否為+:" + result);
realMessage.rewind(); // 把pos重新設為0
return result;
}
/**
* 判斷是否是心跳響應包,不管是對方的,還是自己的
*/
@Override
public boolean isResponse(IoSession session, Object message) {
if(!(message instanceof IoBuffer)) {
return false;
}
IoBuffer realMessage = (IoBuffer)message;
System.out.println();
if(realMessage.limit() != 3) {
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isResponse limit不等於3,RETURN FALSE: message長度:" + realMessage.limit() + " : " + realMessage);
return false;
} else {
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isResponse limit等於3, message長度:" + realMessage.limit() + " : " + realMessage);
}
if (realMessage.remaining() != 3) {
return false;
}
byte[] b = new byte[3];
realMessage.get(b);
boolean result = (b[1] == int_rep);
System.out.println(new SimpleDateFormat("yyyyMMdd-HH:mm:ss-SSS").format(new Date()) + " isResponse 判斷是否為-:" + result);
realMessage.rewind(); // 把pos重新設為0
return result;
}
}
輸出的日誌:
20141113-15:49:00-778 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=2048: 0D 2B 0A]
20141113-15:49:00-779 isRequest 判斷是否為+:true
20141113-15:49:00-779 回心跳包-:HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:00-780 isResponse limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=2048: 0D 2B 0A]
20141113-15:49:00-780 isResponse 判斷是否為-:false
20141113-15:49:00-781 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=2048: 0D 2B 0A]
20141113-15:49:00-781 isRequest 判斷是否為+:true
20141113-15:49:00-782 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:00-783 isRequest 判斷是否為+:false
20141113-15:49:00-783 isResponse limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:00-783 isResponse 判斷是否為-:true
20141113-15:49:25-794 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=1024: 0D 2B 0A]
20141113-15:49:25-795 isRequest 判斷是否為+:true
20141113-15:49:25-795 回心跳包-:HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:25-796 isResponse limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=1024: 0D 2B 0A]
20141113-15:49:25-796 isResponse 判斷是否為-:false
20141113-15:49:25-797 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=1024: 0D 2B 0A]
20141113-15:49:25-797 isRequest 判斷是否為+:true
20141113-15:49:25-798 isRequest limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:25-798 isRequest 判斷是否為+:false
20141113-15:49:25-799 isResponse limit等於3, message長度:3 : HeapBuffer[pos=0 lim=3 cap=3: 0D 2D 0A]
20141113-15:49:25-799 isResponse 判斷是否為-:true
有此得出
以上可得出:
對方是25秒一次心跳包,發+
如果對方先發心跳包,我方回心跳-後,如果心跳一直維持,就不會再主動發出+,除非超過設定的60秒的時候。
本地收到消息後
1、走isRequest,發現傳遞進來的數據為+,則return true,getResponse()回-
2、走isResponse,發現傳遞進來的數據為+,則return false
3、走isRequest,發現傳遞進來的數據為+,則return true,但沒有回-
4、走isRequest,發現傳遞進來的數據為-,則return faslse
5、走isResponse,發現傳遞進來的數據位-,則 return true,但沒有回+
如果本地先發心跳包
發+
isRequest 傳進來+,對方收到+後,回-
isRequest 傳進來-
isResopnse 傳進來-
isResponse 傳進來-
isResponse 傳進來-
㈥ 心跳協議 基於HTTP 的心跳協議 怎麼做 求例子 求java 代碼
客戶端定時往伺服器端請求,請求時帶上session、cookie等信息
㈦ java socket 長連接發送心跳包
你這個問題很先進!現在有一個剛出來的框架可以完全實現你這個需求,叫做Pushlet。
你可以上網查查。
㈧ 菜鳥學騎行之心率
繼上一部「踏頻」之後,很多吃瓜群眾都懵逼了,因為稍微有點兒那麼專業。那麼今天就講講一個與大多數人都關系密切的東西-心率。
心率是什麼
這個應該大家都知道,就是我們常說的心跳次數,簡稱bpm。其實我們平常體檢什麼的,都會來檢查這個,大家也基本上都知道這個數值。
一般人的心跳次數在60~160之間,當然在運動或者興奮的條件下,這個數值會高於這個區間。安靜時候的心率一般人在60~90這個范圍內,運動員或者長期鍛煉的人會偏低,在40,50左右。
心率與健康有著直接的聯系,心率過快或者過緩都會導致一些心臟疾病的產生,而且心率還影響人的壽命。
心率測量
心率指標
運動訓練中常用的心率指標有:基礎心率、安靜心率、運動時心率和運動後恢復心率。
心率區劃分
研究表明心率和有氧運動的脂肪消耗之間有很直接的聯系,當心率變化范圍介於110~180次/min區間時,攝氧量與能量代謝之間存在著顯著的線性關系。根據此關系可以將心率分區,通過控制心率區間,來實現對應的鍛煉效果。
關於最大心率目前都是靠估演算法的,基本公式如下:
如果女性可以加4
比如30歲男性的最大心率就是190
2.保留心率演算法:
最大心率=220-年齡
保留心率=(最大心率-最低心率)
最低心率是早上靜止時測量的,比如60
30歲男性的保留心率就是130
3.通用性心率表述:
最大心率:
男人:210-年齡/2-(0.11 公斤體重)-4
女人:210-年齡/2-(0.11 公斤體重)
當然,還有專業的教練可以通過以下測試騎車的最大心率。
針對入門或初階選手(40公里PB在70分鍾以上者)
FOR 進階或菁英選手(40公里PB在70分鍾以內者)
心跳錶在最後1分鍾所記錄到的平均心率,幾乎已經跟真正的MHR非常接近了,足以當作訓練心率區間的依據。
本文參考文章:
《自行車騎乘最大心率(MHR)檢測流程》 - 美騎論壇
( http://bbs.biketo.com/thread-1760422-1-1.html )
《十年老騎友告訴你,心率是科學騎行的基礎!》 - 行者
( https://sanwen8.cn/p/17aLqeq.html )
㈨ java如何實現客戶端與服務端的心跳機制
socket.sendUrgentData(0xFF)主要是這個
socket是這樣發送心跳的,參考一下,這是我寫過的部分代碼,專門開一個線程發送心跳
new Thread(new Runnable() {
@Override
public void run() {
while(socket!=null && !socket.isClosed()){
try {
socket.sendUrgentData(0xFF);
} catch (IOException e) {
e.printStackTrace();
reconnect();
}
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
log.info("connection is missing!"+Calendar.getInstance().getTime().getTime());
}
}).start();