socket을 통한 server - client간의 일대일 연결을 메세지를 통해 수신받고,
client쪽의 결과와 그 내용을 server쪽으로 재전송하는 과정을 통해 가상회선을 배워보자.

[맛있는 프로그래머의 일상]: https://lktprogrammer.tistory.com/62
TCP 3 Way Handshake는 TCP/IP프로토콜을 이용하여 통신을 하는 응용프로그램이 데이터를 전송하기 위한 과정이다.
이번 socket프로그래밍을 통해 연결전송을 알 수 있었다.
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8200);
System.out.println("EchoServer is started and waiting for client.....");
Socket client = ss.accept();
// 클라이언트의 연결 요청을 무한정 대기. 연결된 클라이언트의 정보(ip address, mac address, port)
System.out.println("Client is connected : "+ client);
// 환영메세지 보내기
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
out.println("Welcom! This is a EchoServer."); // 송신버퍼에 저장 -> 원래는 버퍼가 가득차면 보냄.
out.flush(); // 버퍼에 담기지 않고 바로 나가!. -> 송신 버퍼를 비워라. 전송 시작.
// -> flush되면 버퍼가 비워짐. -> 프로그램 종료 -> socket해제 -> 연결 끊김.
while(true) {
String msg = in.readLine(); // 클라이언트로부터 메세지 수신
System.out.println("From client : " + msg);
if(msg == null) break;
}
} catch (IOException e){
e.printStackTrace(); // 어디서 오류가 나는가
}
}
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class EchoClient {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
try {
Socket socket = new Socket("127.0.0.1", 8200); // 서버에 연결 과정
System.out.println("Connection is successful!!!" + socket);
// 서버의 ip address, port, 자신의 port
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
String msg = in.readLine(); // 수신
System.out.println(msg);
while(true) {
System.out.print("Your message : ");
msg = scn.next();
if (msg.equals("stop")) break;
out.println(msg); // 엔터가 입력되어야 버퍼가 비워짐.!!!
out.flush();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
serversocket 오브젝트 생성. 생성자 인자 값에 client port번호 입력.
accept() 통해 client 접속 대기
connection이 되면 BufferedReader, PrintWriter클래스를 통해 데이터 송수신
PrintWriter 오브젝트인 out을 통해 메세지를 보낼 때,
송신버퍼는 가득 채워서 보내기 때문에 보낼 메세지 이후 flush()로 버퍼를 비워주는 작업이 필요함!!
socket 오브젝트 생성후, 생성자 인자 값에 자신의 ipaddress, server가 열어놓은 port번호를 입력한다
server와 같이 BufferedReader, PrintWriter클래스를 통해 데이터 송수신


다음과 같이 잘 출력됨을 알 수 있다.
이번 내용으로 소켓프로그래밍의 기본적인 내용에 대해 공부할 수 있었다.
앞으로 열심히 공부해보겠다. 틀린 점 있다면 댓글로 알려주시면 감사하겠다.