11 분 소요

👨‍💻🏫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("자원 해제 중 오류 발생"); } } } } ~~~

태그:

카테고리:

업데이트:

댓글남기기