其中通過短連接方式接收Java Socket通訊返回消息,死循環,分別判斷接收和超時,來確定連接連接狀況。通過字節流的形式獲取socket返回消息,主要是因爲通過readline的方式,在我們系統通訊中存在異常。
具體客戶端代碼如下:
package test;
import java.io.*;
import org.apache.log4j.Logger;
static Logger log = Logger.getLogger(SocketClient.class.getName()); // 日誌記錄信息
private String hostName;
private int portNum;
private int delaySecond; // 發文接收返回報文延時
this.hostName = "192.168.0.1";
this.portNum = 7000;
this.delaySecond = 50000;
// pFileOp = null;
}
Socket socket = null;
try {
socket = new Socket(hostName, portNum);
} catch (UnknownHostException e) {
System.out.println("-->未知的主機名:" + hostName + " 異常");
} catch (IOException e) {
System.out.println("-hostName=" + hostName + " portNum=" + portNum
+ "---->IO異常錯誤" + e.getMessage());
}
return socket;
}
String str = "";
String serverString = "";
Socket socket;
try {
socket = getSocket();
// socket.setKeepAlive(true);
if (socket == null) { // 未能得到指定的Socket對象,Socket通訊爲空
return "0001";
}
PrintWriter out = new PrintWriter(socket.getOutputStream());
// log.info("---->發送報文="+strMessage);
out.println(strMessage);
out.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
long sendTime = System.currentTimeMillis();
long receiveTime = System.currentTimeMillis();
boolean received = false; // 成功接收報文
boolean delayTooLong = false;
serverString = null;
while (!received && !delayTooLong) {
if (socket.getInputStream().available() > 0) {
// serverString = in.readLine();
char tagChar[];
tagChar = new char[1024];
int len;
String temp;
String rev = "";
if ((len = in.read(tagChar)) != -1) {
temp = new String(tagChar, 0, len);
rev += temp;
temp = null;
}
serverString = rev;
}
receiveTime = System.currentTimeMillis();
if (serverString != null)
received = true; // 字符串不爲空,接收成功
if ((receiveTime - sendTime) > delaySecond)
delayTooLong = true; // 接收等待時間過長,超時
}
in.close();
out.close();
str = serverString;
if (delayTooLong)
str = "2190"; // 超時標誌爲真,返回超時碼
if (!received)
str = "2190";
socket.close();
} catch (UnknownHostException e) {
log.error("---->出現未知主機錯誤! 主機信息=" + this.hostName + " 端口號="
+ this.portNum + " 出錯信息=" + e.getMessage());
str = "2191";
// System.exit(1);
} catch (IOException e) {
log.error("---->出現IO異常! 主機信息=" + this.hostName + " 端口號="
+ this.portNum + " 出錯信息=" + e.getMessage());
e.printStackTrace();
str = "2191";
} catch (Exception e) {
str = "2177";
log.error("---->出現未知異常" + e.getMessage());
} finally {
socket = null;
str.trim();
// log.info("--->返回的socket通訊字符串="+str);
return str;
}
}
}
以上就是對Java Socket通訊的詳細介紹。希望大家有所幫助。