package ch07.socket3;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerFile {
// 클라이언트 연결을받는 소켓
ServerSocket serverSocket;
// 실제 통신을 하는 소켓
Socket socket;
BufferedReader br;
BufferedWriter bw; // 새로운 스레드가 필요하다.
BufferedReader keyboard; // 새로운 스레드가 필요하다.
public ServerFile() {
System.out.println("1. 서버 소켓 시작-----------");
try {
serverSocket = new ServerSocket(10000);
System.out.println("2. 서버소켓 생성완료 : 클라이언트 접속대가------");
socket = serverSocket.accept(); // 클라이언트 접속 대기중...
System.out.println("3.클라이언트 연결 완료----buffer 연결완료(read)");
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
keyboard = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// write 스레드 실행(글쓰기)
WriteThread wt = new WriteThread();
Thread t1 = new Thread(wt);
t1.start();
// main 스레드 역활 (글 읽기)
while (true) {// 지속되게
String msg = br.readLine();
System.out.println("클라이언트로 부터 받으 메시지 : " + msg);
}
} catch (Exception e) {
System.out.println("서버소켓 에러 발생함" + e.getMessage());
}
}
// 내부 클래스
class WriteThread implements Runnable {
@Override
public void run() {
while (true) {
try {
String keyboardMsg = keyboard.readLine();
bw.write(keyboardMsg + "\n");
bw.flush();
} catch (Exception e) {
System.out.println("서버소켓에서 키보드 입력받는 중 오류발생 : " + e.getMessage());
}
}
}
}
public static void main(String[] args) {
new ServerFile();
}
}
package ch07.socket3;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ClientFile {
Socket socket;
BufferedWriter bw;
BufferedReader keyboard;
// 새로운 스레드 필요
BufferedReader br;
public ClientFile() {
// 소켓 연결
try {
System.out.println("1. 클라이언트 소켓 시작-----------");
socket = new Socket("localhost", 10000); // 서버소켓이 accept()메서드 호출
System.out.println("2. 버퍼(write)연결완료 -----------");
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 키보드 연결
System.out.println("3.키보드 스트림 + 버퍼(read)연결완료 -----------");
keyboard = new BufferedReader(new InputStreamReader(System.in));
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 새로운 스레드 역활(글 읽기)
ReadThread rt = new ReadThread();
Thread t1 = new Thread(rt);
t1.start();
// 메인 스레드의 역활(글쓰기)
while (true) { // 지속되게
System.out.println("4.키보드 입력 대기중 -----------");
String keyboardMsg = keyboard.readLine();
// 메세지의 끝을 알려줘야한다 \n
bw.write(keyboardMsg + "\n");
bw.flush(); // 강제로 버퍼 비워줌
}
} catch (Exception e) {
System.out.println("서버소켓 에러 발생함" + e.getMessage());
}
}
class ReadThread implements Runnable {
@Override
public void run() {
while (true) {
try {
String msg = br.readLine();
System.out.println("서버로 부터 메세지 : " + msg);
} catch (Exception e) {
System.out.println("클라이언트 소켓에서 서버소켓 메세지 입력받는 중 오류발생 : " + e.getMessage());
}
}
}
}
public static void main(String[] args) {
new ClientFile();
}
}
package ex02;
public class Start {
public static void main(String[] args) {
System.out.println("Hello");
}
}
JVM은 변수를 위한 공간을 메모리 차곡차곡 공간을 마련한다.
package ex02;
public class Start2 {
public static void main(String[] args) {
int i; // main() 스택 안에 변수 i 4바이트 공간을 만들어놓음
i = 10; // 해당 공간에 10을 넣어줌
double d = 20.0; // 공간을 만듬과 동시에 할당
}
}
if문은 메서드의 스택 프레임이 아니라 if문, 그것도 참인 블록의 스택 프레임
main() 메서드의 스택 프레임 안에 if 문의 블록 스택 프레임이 중첩되어 생선된다.
package ex02;
public class Start2 {
public static void main(String[] args) {
int i = 10;
int k =20;
//main 스택 프레임안에 if문의 블록 스택 프레임이 중첩됨
if(i==10) {
int m = k+5;
k = m;
}else {
int p =k+10;
k = p;
}
// 블록 스택 프레임이 끝나는 순간 m가 p값은 사라짐
//k = m+ p;
}
}
변수는 어디에 있는가?
: 변수는 메모리에 있다 == 변수는 스태틱 영역, 스택 영역, 힙 영역 세 군대 모두에 있을 수 있다.
지역 변수
클래스 멤버 변수
객체 멤버 변수
외부 스택 프레임에서 내부 스택 프레임의 변수에 접근하는 것은 불가능하나 그 역은 가능하다.