『壹』 java socket如果服務端掉線 客戶端應該怎樣重連,實現的思路是怎麼樣的,最好能有具體的代碼參考一下
看代碼,不明白的追問
// 無窮循環,用於自動重新連接網關
while (true) {
// 捕獲sleep異常
try {
// 捕獲socket異常
try {
// 創建socket連接
socketGateway = new Socket("127.0.0.1", 8888);
// 創建輸入輸出對象
inStream = new DataInputStream(socketGateway.getInputStream());
outStream = new DataOutputStream(socketGateway.getOutputStream());
byte buf[] = new byte[1]; // 數據緩沖區
int intLen; // 讀緩沖區返回的長度
// 無窮循環,用於讀緩沖區數據
while (true) {
// 捕獲讀緩沖區異常
try {
intLen = inStream.read(buf, 0, 1);
// 可讀長度-1則斷開連接
if (intLen == -1) {
break;
}
// 處理buf
}
// 連接斷開
catch (EOFException e) {
break;
}
// 接收數據超時
catch (SocketTimeoutException e) {
break;
}
// 超過數據包末尾
catch (IOException e) {
break;
}
}
} catch (Exception e) {
// 處理socket錯誤
}
// 休眠1秒後重連
sleep(1000);
} catch (Exception e) {
// 處理sleep錯誤
}
}
『貳』 java編程中,Socket通信是怎麼實現的
java編程對於Socket之間的通信過程如下:
服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。下面來看一些服務端與客戶端通信的例子:
publicclassServer{
publicstaticvoidmain(Stringargs[])throwsIOException{
//為了簡單起見,所有的異常信息都往外拋
intport=8899;
//定義一個ServerSocket監聽在埠8899上
ServerSocketserver=newServerSocket(port);
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客戶端建立好連接之後,我們就可以獲取socket的InputStream,並從中讀取客戶端發過來的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}
}
客戶端代碼
Java代碼publicclassClient{
publicstaticvoidmain(Stringargs[])throwsException{
//為了簡單起見,所有的異常都直接往外拋
Stringhost="127.0.0.1";//要連接的服務端IP地址
intport=8899;//要連接的服務端對應的監聽埠
//與服務端建立連接
Socketclient=newSocket(host,port);
//建立連接後就可以往服務端寫數據了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
}
}
『叄』 java中socket如何讓服務端一直等待,客戶端每隔一段時間鏈接一次
1、服務端
使用ServerSocket 在確定埠之後,調用accept() 方法 。 這樣 服務端就會阻塞在accept() 這里 直到有客戶端請求版過來 才會接著往下權執行,後面你就寫獲取文件夾內容的具體邏輯代碼 然後寫入流裡面 傳回給客戶端就可以了
2、客戶端
客戶端你要求每隔一段時間 有很多種方法可以實現 比如說寫個timer 在間隔指定時間段向Server端發起請求就可以了,具體方式就是new Socket(ip,埠) 連接上了之後 可以得到Server端寫在流里的數據 讀出來就可以了
中間的細節 自己去琢磨一下 要循環往復 可以通過多線程來實現。
Socket的具體使用 可以查看官方api或者google
『肆』 java socket 判斷是否斷開了
首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經過試驗並查看相關文檔,這些方法都是本地端的狀態,無法判斷遠端是否已經斷開連接。
然後想到是否可以通過OutputStream發送一段測試數據,如果發送失敗就表示遠端已經斷開連接,類似ping,但是這樣會影響到正常的輸出數據,遠端無法把正常數據和測試數據分開。
最後又回到socket類,發現有一個方法sendUrgentData,查看文檔後得知它會往輸出流發送一個位元組的數據,只要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動舍棄這個位元組,而SO_OOBINLINE屬性默認情況下就是關閉的,太好了,正是我需要的!
於是,下面一段代碼就可以判斷遠端是否斷開了連接:
try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect();
}
用ping實現
package com.csdn.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class test {
static BufferedReader bufferedReader;
public static void main(String[] args) throws IOException {
try {
Process process = Runtime.getRuntime().exec("ping 192.168.1.104");//判斷是否連接的IP;
bufferedReader = new BufferedReader(new InputStreamReader(process
.getInputStream()));
String connectionStr = "";
while ((connectionStr = bufferedReader.readLine()) != null) {
System.out.println(connectionStr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedReader.close();
}
}
}
ping的方法有個嚴重的BUG,就是你只能判斷對方是否連接網路,而不能判斷客戶端是否開啟...
我在寫聊天室時經常要注意客戶端異常退出的問題(比如客戶直接調用任務管理器結束程序進程),
其實在通過socket.getoutstream和socket.getinputstream流對客戶端發送、接受信息時如果socket沒連接上是會拋出異常的,這也就是為什麼Java會要求網路編程都要寫在try裡面,所以只要在catch裡面寫入客戶端退出的處理就行了,沒必要專門去想什麼方法
『伍』 java資料庫自動重連
連接資料庫的話不是有個返回值么,如果返回記錄的話rs.next!=null
如果沒有返回記錄rs.next==null
然後你就內用rs.next判斷
if(rs.next==null)
{
//此處寫方容法等待五秒重新連接調用這個類
}
else
{
//接受資料庫穿出來的值
}
上面如果不行
就寫個try catch語句:
try
{
//連接資料庫
}
catch(...)
{
//如果有異常,說明資料庫還沒有啟動
//等待五秒重新連接調用這個類
}