자바실무 제 15강[KNU 2021-2]
👨💻🏫KNU 2021-2 SW & media 자바실무 필기노트 15
1. 소켓 프로그래밍
TCP/IP 네트워크를 이용하여 쉽게 통신 프로그램을 작성하도록 지원하는 기반기술
소켓
- 두 응용프로그램간 양방향 통신링크의 한쪽 끝 단
- 소켓끼리 데이터를 주고받음
- 특정 포트번호에 연결되어 데이터를 교환
- 서버소켓, 클라이언트 소켓
자바는 소켓 통신을 위한 라이브러리를 지원하며, 이를 이용하여 소켓 프로그래밍을 할 수 있다.
1.1. 소켓 서버-클라이언트 통신프로그램의 구조
클라이언트 | - | 서버 |
---|---|---|
Socket | ServerSocket | |
– | 1. listener= new ServerSocket(port); | |
3. ClientSocket = new Socket(“서버IP”, 서버 port); | ->접속 | 2. Socket soc= listener.accept(); |
4. clientSocket.getOutputStream(); | Socket 4. soc.getInputStream(); |
|
5. 소켓 스트림을 이용한 | <-> | 데이터 입출력 |
6. clientSocket.close(); | 6. soc.close(); |
1.2. 소켓 클래스, 클라이언트 소켓
클라이언트 소켓에 사용되는 클래스로 java.net.Socket 클래스를 사용하여 소켓을 생성한다.
소켓 클래스 생성자 | 설명 |
---|---|
Socket | 미연결 소켓 |
Socket(String address, int port) | 지정된 IP와 포트번호에서 대기하는 원격 프로그램 소켓 연결 |
Socket(String host, int port) | 지정된 호스트와 포트번호에서 대기하는 원격 프로그램 소켓 연결 호스트명이 null인경우 루프백주소 가정 |
소켓 클래스 메소드 | 설명 |
---|---|
void bind(SocketAddress bindpoint) | 소켓을 지정된 주소에 바인딩한다. |
void close() | 소켓을 닫는다. |
void connect(SocketAddress endpoint) | 소켓을 지정된 주소에 연결한다. |
InetAddress getInetAddress() | 소켓의 주소를 반환한다. |
InputStream getInputStream() | 소켓의 입력 스트림을 반환한다. 상대로부터 받은 데이터 리드 가능 |
InexAddress getLocalAddress() | 소켓의 로컬 주소를 반환한다. |
int getLocalPort() | 소켓의 로컬 포트번호를 반환한다. |
int getPort() | 소켓인 연결된 포트번호를 반환한다. |
OutputStream getOutputStream() | 소켓의 출력 스트림을 반환한다. 이 스트링에 출력하면 소켓이 서버로 데이터 전송 |
bool isBound() | 소켓이 로컬주소에 연결되어있다면 true반환 |
bool isClosed() | 소켓이 닫혀있다면 true반환 |
bool isConnected() | 소켓이 연결되어있다면 true반환 |
void setSoTimeout(int timeout) | 소켓의 타임아웃 시간을 지정. 0이면 타임아웃 없음 |
String outputMessage = scanner.nextLine();
out.write(outputMessage +'\n');
out.flush();
//한 행의 문자열 전송
String line = in.readLine();
//한행의 문자열 수신
clientSocket.close();
//접속종료
서버소켓 클래스 생성자 | 설명 |
---|---|
ServerSocket(int port) | 지정된 포트번호에 결합된 소켓 생성 |
서버소켓 클래스 메소드 | 설명 |
---|---|
Socket accept() | 클라이언트로부터 연결요청 대기, 요청시 수락하고 클라이언트와 연결된 새 Socket 객체 반환 |
void close() | 서버 소켓을 닫는다. |
InetAddress getInetAddress() | 서버 소켓의 로컬 IP 주소를 반환한다. |
int getLocalPort() | 서버 소켓의 로컬 포트번호를 반환한다. |
bool isBound() | 서버 소켓이 로컬주소에 연결되어있다면 true반환 |
bool isClosed() | 서버 소켓이 닫혀있다면 true반환 |
void setSoTimeout(int timeout) | accept()의 타임아웃 시간을 지정. 0이면 타임아웃 없음 |
ServerSocket serverSocket = new ServerSocket(port);
Socket socket = serverSocket.accept();
//접속 대기, 연결 요청시 클라이언트 소켓 반환
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//Socket 객체의 getInputStream(), getOutputStream() 메소드를 사용하여 입출력 스트림을 생성.
연결과정 |
---|
1. 서버 - 포트 - 리슨 |
2. 서버 - 포트 - 리슨 <-연결요청 포트 - 클라이언트 1 |
3. 서버 - 포트 - 리슨 <-연결요청 포트 - 클라이언트 2 |
클라이언트 <-연결요청 포트 - 클라이언트 1 |
2. 예제1. 채팅프로그램
서버 | 클라이언트 |
---|---|
### ServerEx.java
~~~java import java.io.*; import java.net.*; import java.util.*; public class ServerEx { public static void main(String[] args) { BufferedReader in = null; BufferedWriter out = null; ServerSocket listener = null; Socket socket = null; Scanner scanner = new Scanner(System.in); try { listener = new ServerSocket(9999); // 서버 소켓 생성 System.out.println("서버 연결 대기중"); socket = listener.accept(); System.out.println("서버 연결 성공"); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); while (true) { String inputMessage = in.readLine(); // 클라이언트 명령 read if (inputMessage.equalsIgnoreCase("종료")) { System.out.println("클라이언트로부터 세션이 종료되었습니다."); break; } System.out.println("메세지: " + inputMessage); System.out.print("메세지 입력: "); String outputMessage = scanner.nextLine(); out.write(outputMessage + "\n"); out.flush();//out버퍼 내용을 서버로 전송 } } catch (IOException e) { System.out.println(e.getMessage()); } finally { try { scanner.close(); socket.close(); listener.close(); } catch (IOException e) { System.out.println("자원 해제 중 오류 발생"); } } } } ~~~ |
### ClientEx.java
~~~java import java.io.*; import java.net.*; import java.util.*; public class ClientEx { public static void main(String[] args) { BufferedReader in = null; BufferedWriter out = null; Socket socket = null; Scanner scanner = new Scanner(System.in); try { socket = new Socket("localhost", 9999); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); while (true) { System.out.print("메세지 입력: "); String outputMessage = scanner.nextLine(); if (outputMessage.equalsIgnoreCase("종료")) { out.write(outputMessage+"\n"); out.flush(); break; } out.write(outputMessage + "\n"); out.flush(); String inputMessage = in.readLine(); System.out.println("메세지: " + inputMessage); } } catch (IOException e) { System.out.println(e.getMessage()); } finally { try { scanner.close(); if(socket != null) socket.close(); } catch (IOException e) { System.out.println("자원 해제 중 오류 발생"); } } } } ~~~ |
댓글남기기