Java Socket通訊客戶端代碼詳解

Java Socket通訊一個相當廣泛的使用,其實在有些時候我們在遇到困難的時候還是需要去找一找相關代碼的介紹。最近工作需要,做了一點Java Socket通訊的東西,積累一點經驗,與大家共分享。
其中通過短連接方式接收Java Socket通訊返回消息,死循環,分別判斷接收和超時,來確定連接連接狀況。通過字節流的形式獲取socket返回消息,主要是因爲通過readline的方式,在我們系統通訊中存在異常。
具體客戶端代碼如下:
 
package test;
import java.net.*;
import java.io.*;
import org.apache.log4j.Logger;
public class SocketClient{
 static Logger log = Logger.getLogger(SocketClient.class.getName()); // 日誌記錄信息
 private String hostName;
 private int portNum;
 private int delaySecond; // 發文接收返回報文延時
 public SocketClient() {
  this.hostName = "192.168.0.1";
  this.portNum = 7000;
  this.delaySecond = 50000;
//  pFileOp = null;
 }
 private Socket getSocket() {
  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;
 }
 public String sendMessage(String strMessage) {
  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通訊的詳細介紹。希望大家有所幫助。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章