123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- package com.icontrols.kakao.socket.utils;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.ConnectException;
- import java.net.InetAddress;
- import java.net.InetSocketAddress;
- import java.net.Socket;
- import java.net.SocketAddress;
- import java.net.SocketTimeoutException;
- import java.security.cert.X509Certificate;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLSocketFactory;
- import javax.net.ssl.TrustManager;
- import javax.net.ssl.X509TrustManager;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * @description SSL Client 용 소켓 생성을 지원하는 api 이다.
- *
- * @import kr.co.icontrols.sslapi.SslClient
- */
- public class SSLClient {
- private static final Logger logger = LoggerFactory.getLogger(SSLClient.class);
- private Socket sslSocket = null;
- private byte[] ServerIP = null;
- /**
- * SSL 암호화된 Socket 을 생성한다. (client 전용)
- *
- * @param host - 소켓에 연결되어야 하는 호스트 주소
- * @param port - 소켓이 접속되고있는 호스트의 포트 번호
- *
- * <br>
- * <br>
- * @Example
- *
- * <pre class="prettyprint">
- * // SslClient 정의
- * SslClient sslClientSocket = new SslClient("10.0.1.1", 10000);
- * // Socket 가져오기
- * Socket socket = sslClientSocket.getSocket();
- * </pre>
- */
- public SSLClient(String host, int port) {
- // 1. Param Check
- if (host == null) {
- logger.info("[SSLClient] Param 'host' is null !!!");
- return;
- }
- // 2. IP Convert & Check
- byte[] retIP = IPConverting(host);
- if (retIP == null) {
- logger.info("[SSLClient] IPConverting Error !!!");
- return;
- }
- ServerIP = retIP;
- // 3. TLS Socket Make
- try {
- SSLContext context = SSLContext.getInstance("TLS");
- context.init(null, trustAllCerts, null);
- SSLSocketFactory sf = context.getSocketFactory();
- // [2018-02-08]
- // * 서버에 DNS Server (bind9)를 설치하여 문제는 해결하였으나, 불필요한 DNS Lookup을 막고자
- // 호스트네임이 정의된 InetAddress 로 IP를 부여함.
- // DNS Lookup 이 일어나지 않게 하기 위하여 호스트네임이 정의된 InetAddress 로 주소를 부여함.
- // IP 만을 "10.0.1.1" 이런 형태로 부여할 경우 Cache 에 접속정보가 없을경우 DNS Lookup이 일어나게되며,
- // DNS Server 가 없을 경우 지연현상이 발생됨.
- logger.info("--> server IP = " + ServerIP);
- InetAddress mInetAddress = InetAddress.getByAddress("", ServerIP);
- logger.info("-->ip address -- " + mInetAddress + " -- " + port);
- sslSocket = sf.createSocket(mInetAddress, port);
- } catch (Exception e) {
- logger.info("[SSLClient] TLS Socket Make Exception Error");
- e.printStackTrace();
- }
- }
- /**
- * 생성된 SSL Socket 을 반환한다.
- *
- * @return (Socket) sslSocket
- */
- public Socket getSocket() {
- return sslSocket;
- }
- /**
- * 신뢰할 수 있는 인증기관의 공개키 인지 검증하는 코드를 사용자 코드로 대체 아무런 동작을 하지 않으며 모든 서버 연결을 신뢰한다는
- * 의미이다.
- */
- private TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
- public X509Certificate[] getAcceptedIssuers() {
- X509Certificate[] myTrustedAnchors = new X509Certificate[0];
- return myTrustedAnchors;
- }
- @Override
- public void checkClientTrusted(X509Certificate[] certs, String authType) {
- }
- @Override
- public void checkServerTrusted(X509Certificate[] certs, String authType) {
- }
- } };
- /**
- * String IP 를 Byte [] IP 로 변환한다.
- *
- * @param inIP - (String) input IP
- *
- * @return (byte []) output IP
- */
- private byte[] IPConverting(String inIP) {
- // 1. Param Check
- if (inIP == null)
- return null;
- // 2. Convert
- char[] CharArray = inIP.toCharArray();
- if (CharArray == null)
- return null;
- for (int i = 0; i < CharArray.length; i++)
- if (CharArray[i] == '.')
- CharArray[i] = ';';
- String newIP = new String(CharArray);
- String[] splitData = newIP.split(";");
- if (splitData == null)
- return null;
- if (splitData.length != 4)
- return null;
- byte[] outIParray = new byte[4];
- for (int i = 0; i < splitData.length; i++)
- outIParray[i] = (byte) Integer.parseInt(splitData[i]);
- // 3. return
- return outIParray;
- }
- public static String sendToWallpad(String ip, String xml) {
- int port = 10000; // 접속할 port - 월 패드/단지서버 포트번호
- Socket requestSock = null;
- SocketAddress socketAddress = new InetSocketAddress(ip, port); // 접속할
- BufferedReader br = null;
- InputStream is = null;
- OutputStream os = null;
- PrintWriter pw = null;
- String sendMsg = null; // 보내는 메시지
- String recvMsg = ""; // 받는 메시지
- StringBuilder sb = new StringBuilder();
- try {
- port += 1000;
- SSLClient sslClientSocket = new SSLClient(ip, port);
- requestSock = sslClientSocket.getSocket();
- sendMsg = xml; // 요청 xml
- os = requestSock.getOutputStream();
- is = requestSock.getInputStream();
- pw = new PrintWriter(new OutputStreamWriter(os)); // 입력한 문자 전송
- // br = new BufferedReader(new InputStreamReader(is));
- pw.println(sendMsg); // sendMsg출력
- pw.flush(); // 버퍼메모리 사용
- // light request를 보내서 reply 수신&출력.
- // String line = null;
- // while ((line = br.readLine()) != null) {
- // logger.info("line = " + line);
- // sb.append(line);
- //
- // // </imap>을 받는데 딜레이 생겨서 안받음.... readline()의 문제? *********
- // if (line.equals(" </service>")) {
- // // System.out.println("service same~~~");
- // break;
- // }
- // }
- // recvMsg = sb.toString();
- // // System.out.println("recvMsg1 = " + recvMsg);
- // if (recvMsg.length() != 0) {
- // recvMsg += "</imap>"; // service에서 멈추기 때문에 마지막 XML 구문을 닫아줘야 함.
- // }
- // // System.out.println("recvMsg2 = " + recvMsg);
- //
- pw.close();
- // br.close();
- requestSock.close();
- } catch (ConnectException ce) {
- // TODO Auto-generated catch block
- recvMsg = "ConnectionException";
- logger.info("[sendToWallpad] - Exception !!! ~~~");
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- ce.printStackTrace();
- } catch (SocketTimeoutException se) {
- // TODO Auto-generated catch block
- recvMsg = "SocketTimeoutException";
- logger.info("connection TIME OUT!!!");
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } catch (IOException ioe) {
- // TODO Auto-generated catch block
- recvMsg = "IOException";
- ioe.printStackTrace();
- }
- // System.out.println("return recvMsg = " + recvMsg);
- // logger.info("recv = " + recvMsg);
- return recvMsg;
- }
- }
|