▶ TCP(Transmission control Protocol)
- 서버, 클라이언트 간의 1:1 소켓 통신
- 데이터를 교환하기에 앞서서 서버, 클라이언트가 연결되어있어야한다.(서버가 먼저 연결되어 있어야 하고 클라이언트의 요청을 대기해야한다.)
- 신뢰성있는 데이터를 전달할 수 있다.
■ ServerSocket
- 서버에서 클라이언트의 요청을 하면 그 요청을 받을 때까지 기다리는 클래스
- 사용법 : ServerSocket server = new ServerSocket(int portNumber)
- 메서드
1. Socket client = server.accept(); 메서드를 통해 클라이언트의 연결을 기다리며 연결요청이 오면 Socket을 반납한다.
■ Socket
- 클라이언트에서 서버에 요청을 하거나, 서버에서 클라이언트의 요청을 받았을 때 사용하는 클래스
- 사용법 : Socket socket = new Socket(String ip주소, int portNumber)
- 메서드
1. OutputStream out = client.getOutputStream(); 메서드를 통해 데이터를 내보낼 수 있는 OutStream객체 생성이 가능하다.
2. InputStream in = client.getInputStream(); 메서드를 통해 데이터를 읽을 수 있는 InputStream객체 생성이 가능하다.
▶ 서버의 연결 순서
1) 서버의 소켓 객체 생성
- Socket client = server.accept();
- 클라이언트의 접속 요청을 기다림
2) 클라이언트의 요청이 오면 수락
3) 클라이언트의 정보를 저장
4) 클라이언트의 정보를 통해서 OutputStream 객체 생성
5) 클라이언트의 정보를 통해서 InputStream 객체 생성
6) 스트림을 통해 입, 출력
7) 통신 종료
■ example
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public void serverStart() {
// 0) 포트 번호 지정
// - 0 ~ 1023 시스템 포트번호
// - 1024 ~ 65535 포트번호를 사용하는 것을 추천
int port = 30027;
// 1) 서버소켓 객체 생성(변수로만 지정)
ServerSocket server = null;
try {
server = new ServerSocket(port);
// 2) 클라이언트의 요청이 오길 기다리는 상태
System.out.println("서버 시작...");
while (true) {
// 3) 접속 요청이 오면 요청 수락 후 해당 클라이언트에 대한 소켓 객체 생성
System.out.println("클라이언트의 요청이 들어올 때 까지 대기중...");
// 4) 클라이언트의 경로를 저장
Socket client = server.accept(); // 클라이언트와 통신할 수 있는 소켓 객체
// 5) 6) 연결된 클라이언트와 입출력 스트림 생성
OutputStream os = client.getOutputStream();
InputStream is = client.getInputStream();
// 보조스트림을 통해 성능개선
// 클라이언트로부터 전달된 값을 한줄단위로 읽어들이기 위한 입력용 스트림
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 클라이언트에게 값을 한줄단위로 출력하는 스트림
PrintWriter pw = new PrintWriter(os, true); // 데이터를 출력해줄 때 print, println 메서드를 사용한다.
// 7) 스트림을 통해 읽고 쓰기
while (true) {
String message = br.readLine(); // 클라이언트로부터 입력이 있을 때까지 블로킹 된다.
if (message == null || "exit".equals(message)) {
System.out.println("접속 종료!!");
break;
} else {
System.out.println(client.getInetAddress().getHostAddress() + "가 보낸 메시지 : " + message);
pw.println("메세지 받기 성공");
pw.flush(); // 현재스트림에 있는 내용 중 출력이 안된 내용을 강제로 내보내는 메서드
}
}
br.close();
pw.close();
client.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
▶ 클라이언트용 TCP 소켓 프로그래밍 순서
1) 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체 생성 ==> 연결요청을 보냄
2) 서버와의 입출력 스트림 오픈
3) 보조스트림을 통해 성능 개선
4) 읽고쓰기
5) 통신종료
■ example
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public void clientStart() {
// 1) 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체 생성
int port = 30027;
String str = null;
String serverIp = null;
Socket socket = null;
serverIp = "192.168.130.29";
try {
// 서버에 연결요청을 보내기 (요청하고자 하는 서버의 ip주소와 포트번호를 동시에 제시해주면서 객체 생성)
// 만약에 서버와 연결이 실패한다면 socket에는 null값이 반환된다.
socket = new Socket(serverIp, port);
if (socket != null) { // 연결성공
// 2) 서버와의 입출력 스트림 오픈
InputStream is = socket.getInputStream(); // 서버가 보낸 값을 입력받을 스트림
OutputStream os = socket.getOutputStream(); // 서버로 값을 출력하는 스트림
// 3) 성능개선
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os, true);
// 4) 스트림을 통해 읽고 쓰기
Scanner sc = new Scanner(System.in);
do {
System.out.print("서버에 보낼 내용을 입력해주세요 : ");
str = sc.nextLine();
pw.println(str);
if (str == null || "exit".equals(str)) {
System.out.println("종료");
break;
}
String message = br.readLine();
System.out.println("받은 메세지 : " + message);
} while (true);
// 5) 통신 종료(스트림, 소켓 닫기)
pw.close();
br.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
'JAVA' 카테고리의 다른 글
JAVA (30) Thread (0) | 2023.04.19 |
---|---|
JAVA (29) 제네릭(Generic) (0) | 2023.04.19 |
JAVA (28) Collection (0) | 2023.04.15 |
JAVA (27) 보조 스트림 (0) | 2023.04.15 |
JAVA (26) FileCharDao (0) | 2023.04.15 |