Java - socket

기존 연동사에서 소켓통신 방식으로 변경해야한다 하여 소켓 연동 진행.

Client Code

@SuppressWarnings("unchecked")
public static <T> T doSocket(String ip, int port, T t) throws Exception {
	Socket socket = null;
	T result = null;
	try {
				// 1. 소켓 생성
        socket = new Socket(); 
        SocketAddress address = new InetSocketAddress(ip, port);
        socket.connect(address);
        socket.setSoTimeout(soTimeout);
        soc_log.info("socekt connected >> getRemoteSocketAddress : "+socket.getRemoteSocketAddress());
        
        // 2. 요청 보내기
        // 보낼 데이터 object -> byteArray로 변환
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(t);
        oos.flush();
        byte[] data = bos.toByteArray();
        // 데이터 전송
        OutputStream os = socket.getOutputStream();
        os.write(data);
        os.flush();
          
        // 3. 응답 받기
        byte[] recvBuffer = new byte[maxBufferSize];
        InputStream is = socket.getInputStream();
        if (is.read(recvBuffer) > 0) {                
        	ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream (recvBuffer));
        	result = (T) ois.readObject();
        }
        
	} catch(ConnectException e) {
		soc_log.info("소켓 연결 실패");
	} catch(Exception e) {
		e.printStackTrace();
	}
	return result;
}

Server Code

  • 테스트를 위해 임시로 사용한 서버코드
public static void main(String[] args) throws IOException{
    SocketServer socketServer = new SocketServer();
    socketServer.run();
  }

public void run() throws IOException{
	ServerSocket server = null;
    try {
        int port = 58004;
        server = new ServerSocket(port);

        while(true){
            System.out.println("-------접속 대기중------");
            Socket socket = server.accept(); // 계속 기다리고 있다가 클라이언트가 접속하면 통신할 수 있는 소켓 반환
            System.out.println(socket.getInetAddress() + "accepted");
            
            // 소켓으로 전달된 데이터 읽기
            InputStream is = socket.getInputStream();
            byte[] bytes = new byte[300];
            if (is.read(bytes) > 0) {
            	// 받은데이터 그대로 재 전달
                System.out.println("클라이언트로 부터 데이터 수신");
                OutputStream os = socket.getOutputStream();
    	        os.write(bytes);
    	        os.flush();
            }
            
            System.out.println("****** 전송 완료 ****");
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
    	if(!server.isClosed()) server.close();
    }
}

2022/01/11

invalid type code: 00

public static byte[] toByteArray (Object obj){
    byte[] bytes = null;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = null;
    try {
        oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.flush();
        bytes = bos.toByteArray();
    }
    catch (IOException e) {
       e.printStackTrace();
    } finally {
	try {
		if(oos != null) oos.close();
		if(bos != null) bos.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
    }
    return bytes;
}

public static Object toObject (byte[] bytes) {
    Object obj = null;
    try {
        ByteArrayInputStream bis = new ByteArrayInputStream (bytes);
        ObjectInputStream ois = new ObjectInputStream (bis);
        obj = ois.readObject();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    return obj;
}
  • stream은 쓰는것과 읽는 것의 형식이 같아야한다.
  • output.writeObject(date) 의 경우로 쓰면 input.readObject()로 읽어야 된다.

EOFException

  • ObjectOutputStream 또는 ObjectInputStream 를 사용하여 직렬화, 역직렬화 하는 과정에서 발생한 Exception
  • readObject() 메소드가 읽을 데이터가 없는 경우, null이 아닌 EOFException 을 반환

references

태그:

카테고리:

업데이트:

댓글남기기