[JAVA] 소켓(Socket) 통신

JoJo·2023년 7월 17일
0

💡 소켓(Socket) 과 소켓통신이란?

소켓(Socket)은 TCP/IP 네트워크를 이용하여 쉽게 통신 프로그램을 작성하도록 지원하는 기반 기술입니다.

소켓통신은 이러한 소켓을 통해 서버 - 클라이언트 간 데이터를 주고받는 양방향 연결 지향성 통신을 말합니다.

소켓 통신은 보통 지속적으로 연결을 유지하면서 실시간으로 데이터를 주고받아야 하는 경우에 사용됩니다.

소켓은 클라이언트 소켓과 서버 소켓으로 구분되며, 소켓간 통신을 위해서는 네트워크상에서 클라이언트와 서버에 해당되는 컴퓨터를 식별하기 위한 IP주소와 해당 컴퓨터내에서 현재 통신에 사용되는 응용프로그램을 식별하기 위한 포트 번호가 사용됩니다.



💡 서버(Server)와 클라이언트(Client)

소켓통신에서는 서버와 클라이언트가 존재하며, 서버(Server)는 데이터를 제공하는쪽, 클라이언트(Client)는 데이터를 요청하여 제공받는 쪽을 말합니다.



💡 ServerSocket 클래스 - 서버 소켓

서버 소켓에서 사용되는 클래스

✔️ ServerSocket 클래스의 생성자


생성자설명
ServerSocket(int port)지정된 포트 번호(port)와 결합된 소켓 생성

✔️ Socket 클래스의 메소드

메소드설명
Socket accept()클라이언트로부터 연결 요청을 기다리다 요청이 들어오면 수락하고 클라이언트와 데이터를 주고받을 새 Socket 객체를 반환
void close()서버 소켓을 닫는다.
InetAddress getInetAddress()서버 소켓의 로컬 IP주소 반환
int getLocalPort()서버 소켓의 로컬 포트 번호 반환
boolean isBound()서버 소켓이 로컬 주소에 연결되어있으면 true 반환
boolean isClose()서버 소켓이 닫혀있으면 true 반환
void setSoTimeout(int timeouot)accecpt() 가 대기하는 타임아웃 시간 지정. 0이면 무한정 대기



💡 Socket 클래스 - 클라이언트 소켓

클라이언트 소켓에서 사용되는 클래스

✔️ Socket 클래스의 생성자

생성자설명
Socket연결되지 않은 상태의 소켓을 생성
Socket(InetAddress address, int port)소켓을 생성하고, 지정된 IP주소(address)와 포트 번호(port)에서 대기하는 원격 응용프로그램의 소켓에 연결
Socket(String host, int port)소켓을 생성하여 지정된 호스트(host)와 포트 번호(port)에 연결한다. 호스트 이름이 null인 경우는 루프백(loopback)주소로 가정

✔️ Socket 클래스의 메소드


메소드설명
void bind(SocketAddress bindpoint)소캣애 로컬 IP주소와 로콜 포트 지정
void close()소켓을 닫는다.
void connect(SocketAddress endpoint)소켓을 서버에 연결
InetAddress getInetAddress()소켓에 연결된 서버IP 주소 반환
InputStream getInputStream()소켓에 연결된 입력 스트림 반환. 이 스트림을 이용하여
소켓이 상대편으로부터 받은 데이터를 읽을 수 있음
InetAddress getLocalAddress()소켓이 연결된 로컬 주소 반환
int getLocalPort()소켓의 로컬 포트 번호 반환
int getPort()소켓에 연결된 서버의 포트 번호 반환
OutputStream getOutputStream()소켓에 연결된 출력 스트림 반환. 이 스트림에 출력하면 소켓이 서버로 데이터 전송
boolean isBound()소켓이 로컬 주소에 연결되어있으면 true 반환
boolean isConnected()소켓이 서버에 연결되어 있으면 true 반환
boolean isClosed소켓이 닫혀있으면 true 반환
void setSoTimeout데이터 읽기 타임아웃 시간 지정. 0이면 타임아웃 해제



💡 서버 소켓 구현하기

1. 서버소켓 생성

ServerSocket serverSocket = new ServerSocket(8000) // 포트번호

2. 클라이언트 접속 대기

Socket socket = serverSocket.accept();

3. 데이터 송수신을 위한 input/output 스트림 생성

InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();

4. InputStream을 통한 데이터 수신(클라이언트 -> 서버)

byte [] bytes = new byte[1024];
int readByteNo = is.read(bytes);
String message = new String(bytes, 0, readByteNo);

5. OutputStream을 통한 데이터 송신(서버 -> 클라이언트)

message = "보낼 메세지" // message 변수에 재할당
os.write(bytes);
os.flush();

6. 통신 종료

socket.close();
severSocket.close();



💡 클라이언트 소켓 구현하기

1. 서버소켓 생성

Socket socket = new Socket("127.0.0.1", 8000); // IP주소, 포트 번호

2. 데이터 송수신을 위한 inputStream/outputStream 생성

InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();

3. OutputStream을 통한 데이터 송신(클라이언트 -> 서버)

String message = "보낼메세지";
os.write(message.getbytes());
os.flush();

4. InputStream을 통한 데이터 수신(서버 -> 클라이언트)

byte [] bytes = new byte[1024];
int readByteNo = is.read(bytes);
String message = new String(bytes, 0, readByteNo);

5. 통신 종료

socket.close();
profile
꾸준히

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기