Client
package ex03_1;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* 클라이언트는 read 버퍼를 만들고
* 서버는 write 버퍼를 추가로 만든다.
* Read버퍼로 읽어서 모니터 출력
*/
public class MyClient {
public MyClient() throws IOException {
//1. 서버 연결
//127.0.0.1 은 루프백주소(OS단에서 백) == local host ==192.168.200.155(사설 IP, 공유기 단에서 백, 비효율적)
Socket socket = new Socket("127.0.0.1", 10000);
//2. 서버쪽으로 메시지 전송
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//3. 키보드 버퍼연결 - 키보드 메시지 받아서!
Scanner sc = new Scanner(System.in);
while(true) {
String chatting = sc.nextLine();
if(chatting.equalsIgnoreCase("quit")){
System.out.println("서버와의 연결을 종료합니다.");
break;
}
writer.write(chatting); //버퍼는 8192바이트
writer.write("\n");//
writer.flush();
BufferedReader cReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String smsg = cReader.readLine();
System.out.println("서버의 메시지 : " + smsg);
}
writer.close();
socket.close();
}
public static void main(String[] args) {
try {
new MyClient();
}catch (Exception e) {
e.printStackTrace();
}
}
}
Server
package ex03;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
// HDX - 스레드가 필요 없다.
public class MyServer {
public MyServer() throws IOException {
// 1. 서버 대기중
ServerSocket serverSocket = new ServerSocket(10000);
Socket socket = serverSocket.accept(); // 리스너 대기중
System.out.println("클라이언트가 연결되었습니다");
// 2.서버 요청 받음
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8")
);
String msg = reader.readLine(); // 버퍼 비우기
System.out.println("클라이언트에게서 요청이 왔습니다 : "+msg);
// 3. 구문 분석 (파싱)
String responseBody = "";
if(msg.equals("text/html")){
responseBody = "<html><h1>Hello</h1></html>";
}else if(msg.equals("text/plain")){
responseBody = "Hello";
}
else{
responseBody = "404 not found";
}
// 4. 서버 응답
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream(), "utf-8")
);
writer.write(responseBody);
writer.write("\n");
writer.flush();
}
public static void main(String[] args) {
try {
new MyServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}
client
package ex04;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/**
* 클라이언트는 read 버퍼를 추가로 만들고
* 서버는 write 버퍼를 추가로 만든다
*/
public class MyClient {
public MyClient() throws IOException {
// 1. 서버 연결
Socket socket = new Socket("127.0.0.1", 10000);
// 2. 버퍼 생성 (송수신 선 만듬)
Scanner keyboard = new Scanner(System.in);
PrintWriter request = new PrintWriter(socket.getOutputStream(), true, StandardCharsets.UTF_8);
BufferedReader response = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8")
);
while(true){
// 3. 키보드로 부터 입력 대기
String requestBody = keyboard.nextLine();
// 4. 서버로 요청
request.println(requestBody);
// 5. 서버로부터 응답
String responseBody = response.readLine();
System.out.println("서버로부터 받은 메시지 : "+responseBody);
}
}
public static void main(String[] args) {
try {
new MyClient();
}catch (Exception e){
e.printStackTrace();
}
}
}
Server
package ex04;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
// HDX - 스레드가 필요 없다.
public class MyServer {
public MyServer() throws IOException {
// 1. 서버 대기중
ServerSocket serverSocket = new ServerSocket(10000);
Socket socket = serverSocket.accept(); // 리스너 대기중
System.out.println("클라이언트가 연결되었습니다");
// 2.서버 요청 받음 (송수신 선)
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8")
);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream(), "utf-8")
);
while(true){
String msg = reader.readLine(); // 버퍼 비우기
System.out.println("클라이언트에게서 요청이 왔습니다 : "+msg);
// 3. 구문 분석 (파싱)
String responseBody = "";
if(msg.equals("text/html")){
responseBody = "<html><h1>Hello</h1></html>";
}else if(msg.equals("text/plain")){
responseBody = "Hello";
}else{
responseBody = "404 not found";
}
// 4. 서버 응답
writer.write(responseBody);
writer.write("\n");
writer.flush();
}
}
public static void main(String[] args) {
try {
new MyServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}
쓰레드 내부의 변수는 쓰레드 간 공유되지 않지만, Main 쓰레드에서 선언된 변수는
쓰레드 간 공유가 가능하다. 변수의 접근범위(Scope)상 접근이 가능하다고 한다.
이렇게 이해 하면 편하다.
-->자기보다 상위 구조에는 접근이 가능
-->일반적으로 메인 쓰레드에서 선언된 변수는 전역변수로 간주된다고 한다.