1. 如何調試java進程
Java程序員必須知道的10個調試技巧
調試可以幫助識解決應用程序缺陷,在本文中,作者將使用大家常用的的開發工具Eclipse來調試Java應用程序。但這里介紹的調試方法基本都是通用的,也適用於NetBeans IDE,我們會把重點放在運行時上面。
在本文中使用的是Eclipse Juno版(Eclipse 4.2),在開始前給大家提3點建議!
不要使用System.out.println作為調試工具
把所有涉及到的組件日誌級別激活並使用
使用日誌分析器來讀取日誌
1.條件斷點
如果你不知道如何添加斷點,只需點擊左邊面板(行號前面)斷點即被創建。在調試界面中,"斷點"視圖會把所有被創建的斷點列出來。我們可以給它加一個布爾條件,也就是說,該斷點會被激活並且如果布爾條件為真,就會執行該斷點,否則將會跳過往下執行。
2.異常斷點
在斷點視圖中,有一個J!標記按鈕!我們可以使用該按鈕來添加一個Java異常斷點。例如,我們想讓程序在遇到空指針異常(NullPointerException)時,仍然能繼續調試,那麼我們可以使用該按鈕來添加一個異常斷點!
3.監視點
這是一個非常好的功能,當選定的屬性訪問或修改程序時,程序會停止執行並允許進行調試。在Outline視圖中選擇一個類變數並從上下文菜單中選擇切換監視點,屬性監視點將會被創建,在斷點(Breakpoints)視圖中會把所有監視點用列表的形式顯示出來。
4.評估/檢查
按Ctrl+Shift+D或者Ctrl+Shift+I來顯示選定變數或者表達式的值。我們也可以給一個變數或表達式添加永久觀察點,當程序在調試時,這些觀察點就會在表達式視圖(Expression view)中顯示出來。
5.修改變數值
在調試過程中,我們可以修改變數值。先選好一個變數然後進入變數視圖(Variables view),根據變數類型在其對應的Value列里輸入值即可。
6.在Main函數裡面停止執行
在運行/調試設置中,編輯配置對話框中有"Main"這個選項卡,我們可以勾選"Stop in main"這個復選框。如果選中,那麼在調試一個基於main方法的Java程序時,程序會在main方法第一行位置便停止執行。
7.環境變數
並不是在系統屬性中添加環境變數,我們可以在編輯配置對話框中很方便地進行添加。
8.Drop to Frame
這也是我最喜歡的一個功能。調試期間,可以重新跳到調用堆棧框架的開始處執行,並且變數值也會回到最初。根據回檔調整堆棧的深度,這個功能的主要用途是所有變數狀態可以快速回到方法開始執行時候的樣子,然後你可以重新進行一遍一遍執行,這樣就可以在你關注的地方進行多次調試,但是在執行過程中也會產生一些副作用,比如插入到資料庫裡面的數據是無法刪除的!
9.分布過濾
當我們進入(F5)方法的時候,我們還可以訪問其外部庫(比如java.*),我們可能不需要這個庫,就可以在Perference選項卡頁面添加一個過濾器來排除這個包。
10.進入、跳出和返回
我把這個放在最後一點,在調試過程中,這些是必須要了解(最好掌握)的東西:
F5——進入:移動到下一個步驟,如果當前行有一個方法調用,該控制項將會跳轉到被調用方法的第一行執行。
F6——跳出:移動到下一行。如果在當前行有方法調用,那麼會直接移動到下一行執行。不會進入被調用方法體裡面。
F7——返回:從當前方法中跳出,繼續往下執行。
F8——移動到下一個斷點處執行。
2. java心跳是怎麼回事兒
1.什麼是心跳包?
心跳包就是在客戶端和伺服器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似於心跳,所以叫做心跳包。
用來判斷對方(設備,進程或其它網元)是否正常運行,採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經離線。用於檢測TCP的異常斷開。基本原因是伺服器端不能有效的判斷客戶端是否在線,也就是說,伺服器無法區分客戶端是長時間在空閑,還是已經掉線的情況。所謂的心跳包就是客戶端定時發送簡單的信息給伺服器端告訴它我還在而已。代碼就是每隔幾分鍾發送一個固定信息給服務端,服務端收到後回復一個固定信息如果服務端幾分鍾內沒有收到客戶端信息則視客戶端斷開。
比如有些通信軟體長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。發包方:可以是客戶也可以是服務端,看哪邊實現方便合理,一般是客戶端。伺服器也可以定時發心跳下去。一般來說,出於效率的考慮,是由客戶端主動向伺服器端發包,而不是伺服器向客戶端發。客戶端每隔一段時間發一個包,使用TCP的,用send發,使用UDP的,用sendto發,伺服器收到後,就知道當前客戶端還處於「活著」的狀態,否則,如果隔一定時間未收到這樣的包,則伺服器認為客戶端已經斷開,進行相應的客戶端斷開邏輯處理。
3. java 如何實現長連接心跳檢測機制
FTP的取文件過程,如果有異常,都可以捕捉到、並進行處理了
4. java服務端檢測APP是否在線
socket,心跳包,互相發,服務端發送時鏈接超時就說明客戶端下線。
5. java中Socket的心跳包設置問題
使用一個線程進行監控,如果空閑一定時間就發送一個心跳包。對於非同步Socket可以一個線程監控多個連接。
6. java的自動發送心跳包究竟是該寫在伺服器還是客戶端
socket.setKeepAlive()應該寫在客戶端,server.accept()是伺服器端的。
心跳的也有現成的,不過依賴別的類。大概貼一下,就是這么個意思。
{
privateCommandDealcommand;
/**
*@returnthecommand
*/
publicCommandDealgetCommand(){
returncommand;
}
/**
*@paramcommand
*thecommandtoset
*/
publicvoidsetCommand(CommandDealcommand){
this.command=command;
}
publicvoidrun(){
longmaxWait=SendConfig.hbhb_wait;
if(maxWait<1000){
maxWait=1000;
}
DatelastTime;
longtimeDiv=0;
while(1==1){
lastTime=SocketQueueObject.getLastContactTime();
if(lastTime!=null){
timeDiv=(newDate()).getTime()-SocketQueueObject.getLastContactTime().getTime();
System.out.println("TimeDiv:"+timeDiv);
}
//上次聯系的時間超過最大等待,或者還沒聯系過
if(lastTime==null||timeDiv>=maxWait){
System.out.println("HBHB");
command.sendHbhbCommand();
}elseif(maxWait>timeDiv){
maxWait=maxWait-timeDiv;
}
try{
this.sleep(maxWait);
}catch(Exceptione){
e.printStackTrace();
}
}
}
{
privatestaticLoggermsg_logger=Logger.getLogger("socketMsg");
@SuppressWarnings("unchecked")
publicListdoCommand(,Mapcommand)throwsException{
List<String>commandList=(List)command.get(Constants.SMSCOMMAND);
byte[]hbhbMsg=TL1Tool.createCommand(commandList.get(0));
msg_logger.info("sendmessagetosmspacked:"+newString(hbhbMsg,"ISO-8859-1"));
TL1RetrunMessageretMsg=socketQueueObject.commNGNServer(hbhbMsg);
retMsg.resolve();
msg_logger.info("recevicemessagefromsms:"+retMsg.getMessage());
ListreturnList=newArrayList();
returnList.add(retMsg);
returnreturnList;
}
}
你可以自己找找看啊。