728x90
반응형
[ Review 복습 ]
서버 | 클라이언트 | |
ServerSocket(port) → 대표 전화 역할 |
||
try 영역 | try 영역 | |
ServerSocket.accept() → 대기 상태 Socket socket = ServerSocket.accept(); → 직원 전화 역할 → Socket이 만들어지면(클라이언트 연결되면) 동작(연결) → 클라이언트가 여러 명일 경우 accept() 여러 개 → 한사람과 통화할 경우 (input, output반복) accept() 한 개 |
socket = new Socket(serverIp, port) → 고객 전화기 역할 → 소캣이 정상적으로 생성됐다는 것은 서버와 접속됨을 의미 → server에 accept가 실행되며, 서버 socket(직원 전화기)이 만들어짐 scanner = new Scanner(System.in) → 콘솔창에 입력받기 위한 객체 |
|
br= new BufferedReader(new InputStreamReader(socket.getInputStream())) → getInputStream : 클라이언트 정보 받아오기 → InputStreamReader : 16비트로 전환 → BufferedReader : 자바 오브젝트로 읽어오기 (직원전화 수화기 - 듣기(입력)) |
pw = new PrintWriter (socket.getOutputStream(), true) → pw = 서버에 출력 → socket.getOutputStream() : 말하는 역할 |
|
pw = new PrintWriter(socket.getOutputStream(), true) → socket.getOutputStream : 서버 정보 출력- 노트스트림 → true: auto flush < 그때 그때 출력 → PrintWriter: 서버 정보 출력- 프로세싱 스트림 (직원전화 송화기 - 말하기(출력)) |
br = new BufferedReader(new InputStreamReader(socket.getInputStream())) → br = 서버로부터 입력받음 → socket.getInputStream() : 듣는 역할 |
|
while (true) → 서버-클라이언트 즉시 출력, 입력됨 (반복) br. readLine(); → 입력 받은 메세지 한 줄씩 읽기 pw.println(); → 클라이언트에 정보 전달 (autoflush이므로 바로 출력) * if (message == null | message.equals("null") | message.trim().equals("종료") { break; } → null 혹은 "종료" 입력받으면 while문 종료 → String.trim() : 양 옆 공백 제거 기능 메서드 |
while (true) → 서버-클라이언트 즉시 출력, 입력됨 (반복) String message = scanner.nextLine(); → 콘솔에서 서버에 보낼 메세지 입력 pw.println(message); → 서버에 정보 전달 (메세지 보내기, 출력) br.readLine(); → 서버에서 받은 메세지 (입력) 읽기 * if (message == null | message.equals("null") | message.trim().equals("종료") { break; } → while 종료 |
|
finally 영역 | finally 영역 | |
if ( socket != null) socket.close(); if (serverSocket != null) serverSocket.close(); → 생성 역순으로 닫아준다. → socket에 pw와 br이 걸려있기 때문에, socket을 닫으면 둘 다 닫힌다. |
if ( scanner != null) scanner.close(); if (socket != null) socket .close(); → 생성 역순으로 닫아준다. |
Server code
/TestServer.java
package review;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* step 3: 메아리 서버 복습
*/
public class TestServer {
private void go() throws IOException {
ServerSocket serverSocket = null; //대표전화
Socket socket = null; //직원 전화
BufferedReader br = null; //직원전화 수화기 - 입력
PrintWriter pw = null; //직원전화 송화기 - 출력
try {
// 직원전화 생성 : 서버 실행 중
serverSocket = new ServerSocket(5432);
System.out.println("서버 실행 - 클라이언트 접속 대기");
// 클라이언트가 접속하면(클라이언트 소캣 생성되면)
// 직원전화(일반 Socket) 대기상태에서 -> socket(클라이언트)연결
// (accept() 리턴)
socket = serverSocket.accept();
System.out.println(socket.getInetAddress()+ " 님 접속했습니다");
// 클라이언트로부터 정보 받기
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream(), true);
// 서버-클라이언트 송수신 블럭
while(true)
{
// Client에서 입력 받은 메세지 읽기
String message = br.readLine();
if (message == null | message.equals("null") |
message.trim().equals("종료"))
{
System.out.println("**서버를 종료합니다**");
break;
}
// 콘솔창에 받은 메세지 보여주기
System.out.println("Client로부터 입력받은 메세지 :" + message);
// Client에 메세지 바로바로 보내기
pw.println(message + "*server*");
}
} finally {
if (socket != null)
socket.close();
if (serverSocket != null)
serverSocket.close();
}
}
public static void main(String[] args) {
try {
new TestServer().go();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Client code
/TestCode.java
package review;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import common.IP;
public class TestClient {
private void go() throws UnknownHostException, IOException {
Socket socket = null; // 클라이언트 전화기
Scanner scanner = null; // 콘솔에서 입력받는 객체
PrintWriter pw = null; // 서버에 출력할 스트림
BufferedReader br = null; // 서버에서 입력받을 스트림
try {
socket = new Socket(IP.LOCAL, 5432); // 소켓이 정상적으로 생성되면 서버와 접속
System.out.println("클라이언트가 서버에 접속");
// 콘솔창에 입력받기 위한 객체
scanner = new Scanner(System.in);
// 서버에 출력
pw = new PrintWriter(socket.getOutputStream(), true);
// 서버에 입력
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 콘솔에서 입력받아 서버에 출력하고 서버에서 입력받아 콘솔에 출력
while (true)
{
System.out.print("서버에 보낼 메세지:");
//콘솔에서 서버에 보낼 메세지 입력
String message = scanner.nextLine();
pw.println(message); //서버에 메세지 보내기(출력)
if (message == null | message.equals("null") |
message.trim().equals("종료"))
{
System.out.println("**클라이언트를 종료합니다**");
break;
}
// 서버에서 받은 메세지 (입력) 읽기
System.out.println("서버에서 받은 메세지: "+br.readLine());
}
} finally {
if (scanner != null)
scanner.close();
if (socket != null)
socket.close();
}
}
public static void main(String[] args) {
try {
new TestClient().go();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Server Console 결과
Client Console 결과
728x90
반응형