2017-01-31 5 views
1

特定のポートとDNS上のサーバーと通信するソケットプログラムを作成する必要があります。通信は、単一のメッセージまたはメッセージのリストとすることができる。すべてのメッセージに対して、サーバーから応答が生成されます。接続が確立されると、最初のメッセージに対する応答が返されますが、次のメッセージでは-1の応答が返されます。バッチ通信をサポートしていませんポート上のサーバーからのJavaの読み取り結果は-1

public class SocketCommunication { 

static String[]  adresses = null; 

final static int port  = 1234; 
final static int timeout  = 60000; 
static long   pbmId; 
private static int count  = 0; 

private static void loadPBMDNS() 
{ 
    DynamicQuery pbmQuery = PH_PBM_SwitchLocalServiceUtil.dynamicQuery(); 
    pbmQuery.add(RestrictionsFactoryUtil.eq("Activated", true)); 
    try 
    { 
     List<PH_PBM_Switch> pbmList = PH_PBM_SwitchLocalServiceUtil.dynamicQuery(pbmQuery); 
     if(pbmList != null && pbmList.size() > 0) 
     { 
      if(pbmList.get(0).getServer_DNS() != null 
        && !pbmList.get(0).getServer_DNS().equals("")) 
      { 
       pbmId = pbmList.get(0).getPBM_Switch_Id(); 
       if(pbmList.get(0).getServer_DNS().contains(";")) 
       { 
        String[] tokens = pbmList.get(0).getServer_DNS().split(";"); 
        System.out.println(tokens.toString()); 
        adresses = tokens; 
       } 
       else 
       { 
        adresses[0] = pbmList.get(0).getServer_DNS(); 
       } 
      } 
     } 
    } 
    catch (SystemException e) 
    { 
     e.printStackTrace(); 
    } 
} 

public static ArrayList<BatchClaimVO> ConnectSendAndReadResponse 
    (int addressNumber, ArrayList<BatchClaimVO> batchClaimVOs) 
{ 

    try 
    { 

     loadPBMDNS(); 
     System.out.println("Connecting to " + adresses[addressNumber] + " on port " + port); 
     SocketFactory sslsocketfactory = SSLSocketFactory.getDefault(); 
     SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(); 
     sslsocket.connect(new InetSocketAddress(adresses[addressNumber], port), timeout); 
     System.out.println("Just connected to " + sslsocket.getRemoteSocketAddress()); 
     for (int i = count; i < batchClaimVOs.size(); i++) 
     { 
      sendClaim(
       sslsocket, 
       batchClaimVOs.get(i).getCb(), 
       batchClaimVOs.get(i).getUniqueIdentifier() 
      ); 
      if(addressNumber <= 2) 
      { 
       batchClaimVOs.get(i).setResponse 
        (readResponse(sslsocket, addressNumber, batchClaimVOs.get(i).getCb())); 
      } 
     } 
     System.out.println("Closing socket"); 
     count = 0; 
     sslsocket.close(); 
     return batchClaimVOs; 
    } 
    catch (IOException e) 
    { 
     if(addressNumber < 2) 
     { 
      System.out.println("connection timedout trying again on new DNS"); 
      ConnectSendAndReadResponse(++addressNumber, batchClaimVOs); 
     } 
     else 
     { 
      System.out.println 
       ("unable to connect to server or server did not responed intime"); 
      e.printStackTrace(); 
     } 

    } 
    return null; 
} 

public static void sendClaim(SSLSocket sslSocket, ClaimBuilder cb, long uniqueIdentifier) 
throws IOException 
{ 
    System.out.println("sending claim"); 
    OutputStream outToServer = sslSocket.getOutputStream(); 
    DataOutputStream out = new DataOutputStream(outToServer); 
    out.writeBytes(cb.getClaim()); 
    System.out.println("claim sent"); 

    SaveRequestLog(uniqueIdentifier, cb.getClaim(), pbmId); 
} 

public static void SaveRequestLog(long uniqueIdentifier, String claim, long pbmId) 
{ 
    if(uniqueIdentifier > 0) 
    { 
     try 
     { 
      PH_Request_Transaction_Log log = PH_Request_Transaction_LogLocalServiceUtil.getPH_Request_Transaction_Log(uniqueIdentifier); 
      log.setPBM_Switch_Id(pbmId); 
      log.setRequest_Log(claim); 

      log.setCreated_By(LiferayFacesContext.getInstance().getUserId()); 
      log.setCreated_Date(Calendar.getInstance().getTime()); 
      PH_Request_Transaction_LogLocalServiceUtil.updatePH_Request_Transaction_Log(log); 
     } 
     catch (PortalException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (SystemException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

public static String readResponse(SSLSocket sslSocket, int addressNumber, ClaimBuilder cb) 
throws IOException 
{ 
    sslSocket.setSoTimeout(timeout); 
    InputStream inFromServer = sslSocket.getInputStream(); 
    DataInputStream in = new DataInputStream(inFromServer); 

    byte[] data = new byte[1048]; 
    int count = in.read(data); 
    System.out.println(count); 
    System.out.println(new String(data)); 
    String response = fixString(new String(data), count); 
    System.out.println("Verifying checksum"); 

    if(verifyTransmissionCheckSum(response)) 
    { 
     System.out.println("checksum verified"); 
     System.out.println(response); 
    } 
    else 
    { 
     System.out.println("transmission corrupted"); 
    } 
    sendAcknowledgement(sslSocket, cb); 
    return response; 

} 

public static void sendAcknowledgement(SSLSocket sslSocket, ClaimBuilder cb) 
throws IOException 
{ 
    System.out.println("sending Acknowledgement"); 
    OutputStream outToServer = sslSocket.getOutputStream(); 
    DataOutputStream out = new DataOutputStream(outToServer); 
    out.writeBytes(cb.buildClaimAcknowledgement()); 
    System.out.println("Acknowledgement Sent"); 
    count++; 
} 

public static String fixString(String toFix, int count) 
{ 
    return toFix.substring(0, count); 
} 

public static boolean verifyTransmissionCheckSum(String str) 
{ 
    return (Integer.parseInt((String) str.subSequence(0, 4)) 
      == (str.subSequence(4, str.length())).length()) 
     ? true : false; 
} 

}

+0

多分あなたのコードやスタックを追加できますか? – MateuszW90

+0

ちょうどそれをしました.. –

答えて

0

指定されたサーバー:以下は、クラス処理クライアントサーバ間の通信です。

関連する問題