1. 소켓 (Socket)
- TCP 프로토콜을 사용하여 통신을 하는데 쓰임(TCP의 기본 : IP / Port 번호가 필요)
- 네트워크 상에서 서버, 클라이언트 두 개의 프로그램이 특정 포트를 통해 양방향 통신이 간으하도록 만들어주는 소프트웨어 장치.
- java.net에서 ServerSocket 클래스(서버측)와 Socket 클래스(서버측 + 클라이언트측)를 이용하여 서버와 클라이언트 간의 통신을 가능하게 만듦.
- 자바 채팅 프로그램의 기초는 서버 - 클라이언트 간의 연결이 가능해야 하는데, 소켓 프로그래밍으로 가능함(하나의 서버에 여러 개의 클라이언트가 접속하는 멀티 클라이언트 채팅 프로그램도 가능).
* IP : 컴퓨터마다 가지고 있는 고유의 주소
port : 통신을 위한 연결 라인
2. 자바 소켓 프로그래밍 (TCP)
- 소켓 프로그래밍 중의 하나. 스트림 통신 프로토콜.
- 연결 지향 프로토콜 : 양 쪽의 소켓이 연결된 상태여야 함.
- 송신 > 수신시 차례대로, 연결된 순서대로 데이터를 교환해야 함(신뢰성이 높음).
- java.net.ServerSocket : 서버측에서 클라이언트의 접속에 대기하기 위해 필요한 클래스.
- java.net.Socket : 서버 - 클라이언트 간 통신하기 위해 필요한 클래스.
3. 자바 소켓 프로그래밍 실행 순서
4. 자바 소켓 프로그래밍 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 |
package lesson01.exam02.server;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
//간단한 소켓 서버 프로그램. 소켓 연결이 되면 현재 시간을 출력하고 연결된 소켓을 닫음
public class SimpleSockterServer {
static final int PORT = 8888;
public static void main(String[] args) {
try{
// ServerSockter 생성 (포트 번호를 사용하는 서버 소켓)
// 서버용 소켓. 통신은 불가능하고 클라이언트의 연결만을 기다림
// ServerSocket 소켓변수명 = new ServerSocket(포트번호);
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("console> 서버 : 클라이언트의 접속을 기다립니다.");
// 소켓 서버가 종료될 때까지 무한루프
while(true) {
// 클라이언트와 연결이 되면 실제로 통신을 하기 위해 만들어야 하는 소켓
// 서버소켓.accept();
// 클라이언트 소켓에서 요청을 할 때까지 소켓 서버가 대기 상태가 됨
// 클라이언트 소켓 수가 많아질 시 요청 횟수가 증가하면서 스레드가 늘어나면
// 서버 자원을 많이 소모함
// => 스레드풀(Thread Pool)이 등장하게 됨 : 다중 접속 처리가 원활해짐
Socket socket = serverSocket.accept();
System.out.println("console> 서버 " + socket.getInetAddress() + " 클라이언트와 " +
socket.getLocalPort() + " 포트로 연결되었습니다.");
try {
// 응답을 통해 스트림을 얻어옴(서버에서 클라이언트의 입력을 받아들임)
OutputStream stream = socket.getOutputStream();
// 현재 날짜를 받아와 출력함
stream.write(new Date().toString().getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
// 소켓은 반드시 닫아야 함
socket.close();
}
}
// 예외처리 } catch (IOException e) {
e.printStackTrace();
}
}
} |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
package lesson01.exam02.server;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
//소켓 클라이언트 프로그램. 소켓 서버에 접속하여 결과 출력하고 프로그램을 종료함
//서버 소켓은 필요 없고, InputStream을 OutputStream으로, InputStreamReader를 OutputStreamWriter로 바꾸면 됨
//서버 소켓에서 생성한 서버의 IP, port번호를 알고 있어야 함
public class SimpleSocketClient {
static final int PORT = 8888;
public static void main(String[] args) {
try {
// 소켓 생성
Socket socket = new Socket("localhost", PORT);
System.out.println("console> PORT(" + PORT + ") 로 접속을 시도합니다.");
// 스트림을 얻어옴
InputStream stream = socket.getInputStream();
// 스트림을 래핑함(클라이언트에서 서버로부터 수신 받은 메세지 받아들임)
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
// 결과를 읽음(서버로부터 온 메세지 수신)
String response = br.readLine();
System.out.println("console> 수신 response : " + response);
// 소켓 닫음
socket.close();
// 프로그램 종료
System.exit(0);
// 예외처리 } catch (Exception e) {
e.printStackTrace();
}
}
} |
cs |
클래스명 |
설명 |
특징 |
InputStream |
byte 단위로 입력 받는 최상위 클래스 |
객체화가 불가능한 추상 클래스. (상속 받아 사용해야 함) |
OutputStream |
byte 단위로 출력 받는 최상위 클래스 | |
Reader |
문자 단위 입력 스트림 | |
Writer |
문자 단위 출력 스트림 | |
BufferReader |
Buffer에 있는 IO 클래스. 읽는 클래스 |
|
BufferedWriter |
Buffer에 있는 IO 클래스. 쓰는 클래스 |
'BackEnd > Java' 카테고리의 다른 글
Java :: 스레드(Thread) (0) | 2016.10.12 |
---|---|
Java :: Code vs Heap vs Stack (0) | 2016.10.10 |
Java :: 업캐스팅(UpCasting) vs 다운캐스팅(DownCasting) (0) | 2016.10.05 |
Java :: final과 static (0) | 2016.09.30 |
Java :: 자바 다운로드 + 이클립스 설치 (JDK 1.8 Windows8 64bit) (0) | 2016.09.04 |