KH 34일차(네트워크, 소켓프로그래밍)
네트워크(Network)
: 여러대의 컴퓨터를 통신 회선으로 연결한 것(홈 네트워크, 지역 네트워크, 인터넷 등이 해당
서버와 클라이언트
▶ 네트워크로 연결된 컴퓨터간의 관계를 역할로 구분한 개념
▶ 서버는 서비스를 제공하는 프로그램으로 클라이언트의 연결을 수락하고 요청 내용을 처리 후 응답을 보내는 역할
▶ 클라이언트는 서비스를 받는 프로그램으로 네트워크 데이터를 필요로 하는 모든 어플리케이션이 해당 됨
소켓 프로그래밍
소켓을 이용한 통신 프로그래밍
소켓 | 프로세스간의 통신에 사용되는 양쪽 끝 단 |
TCP | 데이터 전송 속도가 느리지만 정확하고 안정적으로 전달할 수 있는 연결 지향적 프로토콜 |
UDP | 데이터 전송 속도가 빠르지만 신뢰성 없는 데이터를 전송하는 비연결 지향적 프로토콜 |
TCP 소켓 프로그래밍
▶ 클라이언트와 서버간의 1:1 소켓 통신
▶ 서버가 먼저 실행 되어 클라이언트의 요청을 기다려야 하고 서버용 프로그램과 클라이언트용 프로그램을 따로 구현해야 함
▶ 자바에서는 TCP 소켓 프로그래밍을 위해 java.net 패키지에서 serverSocket 과 Socket클래스 제공.
서버용 TCP 소켓 프로그래밍 순서
1. 서버의 포토번호를 정한다.
2. 서버용 소켓 객체를 생성한다.
3. 클라이언트 쪽에서 접속 요청이 오길 기다린다.
4. 접속 요청이 오면 요청 수락 후 해당 클라이언트에 대한 소켓 객체를 생성한다.
5. 연결된 클라이언트와 입출력 스트림을 생성한다.
6. 보조 스트림을 통해 성능을 개선한다.
7. 스트림을 통해 읽고 쓴다.
8. 통신을 종료한다.
1. 서버의 Port 번호를 정한다.
public class Server {
public void serverStart() {
// 서버의 포트번호를 지정한다.
// 포트번호는 1024 ~ 65335 사이의 포트번호를 사용하는것이 바람직하다.
int port = 9999;
2. 서버용 소켓 객체를 생성한다.
public class Server {
public void serverStart() {
// 서버의 포트번호를 지정한다.
// 포트번호는 1024 ~ 65335 사이의 포트번호를 사용하는것이 바람직하다.
int port = 9999;
// 서버용 소켓 객체를 생성한다.
ServerSocket server = null;
3. 클라이언트 쪽에서 접속 요청이 오길 기다린다.
4. 접속 요청이 오면 요청 수락 후 해당 클라이언트에 대한 소켓 객체를 생성한다.
public class Server {
public void serverStart() {
// 서버의 포트번호를 지정한다.
// 포트번호는 1024 ~ 65335 사이의 포트번호를 사용하는것이 바람직하다.
int port = 9999;
// 서버용 소켓 객체를 생성한다.
ServerSocket server = null;
// 클라이언트의 접속 요청을 기다린다.
try{
server = new ServerSocket(port);
System.out.println("서버 접속 . . . . ");
System.out.println("서버 접속 대기중 . . . . .");
Socket client = server.accept();
System.out.println("클라이언트 접속 완료 . . . . .");
5. 연결된 클라이언트와 입출력 스트림을 생성한다.
public class Server {
public void serverStart() {
// 서버의 포트번호를 지정한다.
// 포트번호는 1024 ~ 65335 사이의 포트번호를 사용하는것이 바람직하다.
int port = 9999;
// 서버용 소켓 객체를 생성한다.
ServerSocket server = null;
// 클라이언트의 접속 요청을 기다린다.
try{
server = new ServerSocket(port);
System.out.println("서버 접속 . . . . ");
System.out.println("서버 접속 대기중 . . . . .");
Socket client = server.accept();
System.out.println("클라이언트 접속 완료 . . . . .");
// 연결된 클라이언트와 입출력 스트림을 생성.
InputStream is = client.getInputStream();
OutputStream os = client.getOutputStream();
6. 보조 스트림을 통해 성능을 개선한다.
public class Server {
public void serverStart() {
// 서버의 포트번호를 지정한다.
// 포트번호는 1024 ~ 65335 사이의 포트번호를 사용하는것이 바람직하다.
int port = 9999;
// 서버용 소켓 객체를 생성한다.
ServerSocket server = null;
// 클라이언트의 접속 요청을 기다린다.
try{
server = new ServerSocket(port);
System.out.println("서버 접속 . . . . ");
System.out.println("서버 접속 대기중 . . . . .");
Socket client = server.accept();
System.out.println("클라이언트 접속 완료 . . . . .");
// 연결된 클라이언트와 입출력 스트림을 생성.
InputStream is = client.getInputStream();
OutputStream os = client.getOutputStream();
// 보조 스트림을 통해 성능을 개선한다.
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os, true);
7. 스트림을 통해 읽고 쓰기
public class Server {
public void serverStart() {
// 서버의 포트번호를 지정한다.
// 포트번호는 1024 ~ 65335 사이의 포트번호를 사용하는것이 바람직하다.
int port = 9999;
// 서버용 소켓 객체를 생성한다.
ServerSocket server = null;
// 클라이언트의 접속 요청을 기다린다.
try{
server = new ServerSocket(port);
System.out.println("서버 접속 . . . . ");
System.out.println("서버 접속 대기중 . . . . .");
Socket client = server.accept();
System.out.println("클라이언트 접속 완료 . . . . .");
// 연결된 클라이언트와 입출력 스트림을 생성.
InputStream is = client.getInputStream();
OutputStream os = client.getOutputStream();
// 보조 스트림을 통해 성능을 개선한다.
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os, true);
// 스트림을 통해 읽고 쓰기
while(true){
String message = br.readLine();
if(message == null || message.equals("exit")){
System.out.println("접속을 종료합니다");
break;
} else{
System.out.println(client.getInetAddress().getHostAddress() + " 님이 메세지를 보냈습니다 " + message);
pw.println("메세지 받기 성공");
pw.flush();
}
}
8. 통신을 종료한다.
public class Server {
public void serverStart() {
// 서버의 포트번호를 지정한다.
// 포트번호는 1024 ~ 65335 사이의 포트번호를 사용하는것이 바람직하다.
int port = 9999;
// 서버용 소켓 객체를 생성한다.
ServerSocket server = null;
// 클라이언트의 접속 요청을 기다린다.
try{
server = new ServerSocket(port);
System.out.println("서버 접속 . . . . ");
System.out.println("서버 접속 대기중 . . . . .");
Socket client = server.accept();
System.out.println("클라이언트 접속 완료 . . . . .");
// 연결된 클라이언트와 입출력 스트림을 생성.
InputStream is = client.getInputStream();
OutputStream os = client.getOutputStream();
// 보조 스트림을 통해 성능을 개선한다.
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os, true);
// 스트림을 통해 읽고 쓰기
while(true){
String message = br.readLine();
if(message == null || message.equals("exit")){
System.out.println("접속을 종료합니다");
break;
} else{
System.out.println(client.getInetAddress().getHostAddress() + " 님이 메세지를 보냈습니다 " + message);
pw.println("메세지 받기 성공");
pw.flush();
}
}
// 통신을 종료한다.
br.close();
client.close();
pw.close();
} catch(IOException e){
e.printStackTrace
}
}
}
클라이언트용 TCP 소켓 프로그래밍 순서
1. 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성한다.
2. 서버와의 입출력 스트림을 오픈한다.
3. 보조 스트림을 통해 성능을 개선한다.
4. 스트림을 통해 읽고 쓴다.
5. 통신을 종료한다.
1. 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성한다.
public class Client {
public void clientStart() {
// 서버의 IP 주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성.
int port = 9999;
String serverIP = null;
Socket socket = null;
String str;
try {
serverIP = InetAddress.getLocalHost().getHostAdderss();
socket = new Socket(serverIP, port);
2. 서버와의 입출력 스트림을 오픈한다.
public class Client {
public void clientStart() {
// 서버의 IP 주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성.
int port = 9999;
String serverIP = null;
Socket socket = null;
String str;
try {
serverIP = InetAddress.getLocalHost().getHostAdderss();
socket = new Socket(serverIP, port);
if(socket != null) {
// 서버와의 입출력 스트림을 오픈한다.
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutPutStream();
3. 보조 스트림을 통해서 성능을 개선한다.
public class Client {
public void clientStart() {
// 서버의 IP 주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성.
int port = 9999;
String serverIP = null;
Socket socket = null;
String str;
try {
serverIP = InetAddress.getLocalHost().getHostAdderss();
socket = new Socket(serverIP, port);
if(socket != null) {
// 서버와의 입출력 스트림을 오픈한다.
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutPutStream();
// 보조 스트림을 통해서 성능을 개선한다.
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os, true);
4. 스트림을 통해 읽고 쓰기
public class Client {
public void clientStart() {
// 서버의 IP 주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성.
int port = 9999;
String serverIP = null;
Socket socket = null;
String str;
try {
serverIP = InetAddress.getLocalHost().getHostAdderss();
socket = new Socket(serverIP, port);
if(socket != null) {
// 서버와의 입출력 스트림을 오픈한다.
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutPutStream();
// 보조 스트림을 통해서 성능을 개선한다.
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os, true);
// 스트림을 통해 읽고 쓰기
Scanner scanner = new Scanner(System.in);
do {
System.out.print("서버에 보낼 내용 : ");
str = scanner.nextLine();
pw.println(str);
pw.flush();
if(str == null || str.equals("exit")){
System.out.println("접속 종료");
break;
}
String message = br.readLine();
System.out.println("받은 메세지 : " + message);
}while(true);
5. 통신 종료(스트림, 소켓 닫기)
public class Client {
public void clientStart() {
// 서버의 IP 주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성.
int port = 9999;
String serverIP = null;
Socket socket = null;
String str;
try {
serverIP = InetAddress.getLocalHost().getHostAdderss();
socket = new Socket(serverIP, port);
if(socket != null) {
// 서버와의 입출력 스트림을 오픈한다.
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutPutStream();
// 보조 스트림을 통해서 성능을 개선한다.
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os, true);
// 스트림을 통해 읽고 쓰기
Scanner scanner = new Scanner(System.in);
do {
System.out.print("서버에 보낼 내용 : ");
str = scanner.nextLine();
pw.println(str);
pw.flush();
if(str == null || str.equals("exit")){
System.out.println("접속 종료");
break;
}
String message = br.readLine();
System.out.println("받은 메세지 : " + message);
}while(true);
pw.close();
br.close();
socket.close();
scanner.close();
}
} catch(IOException e){
e.printStackTrace();
}
}
}
Java를 공부하면서 ArrayList, TCP Socket 이 2개의 클래스는 꼭 Java API를 참조해가면서 무한 코딩해서 외우자...
내일 금요일,, 강화도 여행,,, 하루만 버티자