"이것이 자바다" 유투브 동영상 강좌(https://www.youtube.com/watch?v=twd6mwUS1Bc)에 나오는 코드를 적고 테스트해보고 기록해둔다.
Socket을 활용하여 Clinet측에서 Server로 일대일 연결을 유지하면서 Client측에서 보낸 메세지를 Server측에서 수신하여 수신 받은 메세지를 다시 Client측으로 송신하는 프로그램 구현이다.
서버 소켓 코드
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket;
public class ChatServer {
public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null;
try { // 소켓 생성 serverSocket = new ServerSocket(); // 포트 바인딩 serverSocket.bind(new InetSocketAddress("localhost", 5001));
while (true) { System.out.println("[연결 기다림]"); // 연결 수락 socket = serverSocket.accept(); // 클라이언트가 접속해 오기를 기다리고, 접속이 되면 통신용 socket 을 리턴한다. // 연결된 클라이언트 IP 주소 얻기 InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress(); System.out.println("[연결 수락함] " + isa.getHostName());
byte[] bytes = null; String message = null;
// 데이터 받기 InputStream is = socket.getInputStream(); bytes = new byte[100]; int readByteCount = is.read(bytes); message = new String(bytes, 0, readByteCount, "UTF-8"); System.out.println("[데이터 받기 성공] " + message);
// 데이터 보내기 OutputStream os = socket.getOutputStream(); message = "Hello Client"; bytes = message.getBytes("UTF-8"); os.write(bytes); os.flush(); System.out.println("[데이터 보내기 성공]");
is.close(); os.close(); socket.close(); } } catch (Exception e) { e.printStackTrace(); }
if (!serverSocket.isClosed()) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } }
}
}
|
클라이언트 코드
import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket;
public class ChatClient {
public static void main(String[] args) {
Socket socket = null;
try { socket = new Socket(); System.out.println("[연결 요청]"); socket.connect(new InetSocketAddress("localhost", 5001)); System.out.println("[연결 성공]"); byte[] bytes = null; String message = null;
OutputStream os = socket.getOutputStream(); message = "Hello Server, I'm Client."; bytes = message.getBytes("UTF-8"); os.write(bytes); os.flush(); System.out.println("[데이터 보내기 성공]"); InputStream is = socket.getInputStream(); bytes = new byte[100]; int readByteCount = is.read(bytes); message = new String(bytes,0,readByteCount,"UTF-8"); System.out.println("[데이터 받기 성공] " + message); os.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } if (!socket.isClosed()) { try { socket.close(); } catch (Exception e) { e.printStackTrace(); } }
}
}
|
코드를 작성하고 실행하면 콘솔에 나오는 출력 결과를 확인하고 알 수 있다.
GitHub 에 간단하면서도 좋은 예제가 있다.
https://gist.github.com/junsuk5/f0ff2298e17853dc48e89f2dfc7bd985