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
를 사용하여 직렬화, 역직렬화 하는 과정에서 발생한 ExceptionreadObject()
메소드가 읽을 데이터가 없는 경우, null이 아닌EOFException
을 반환
references
댓글남기기