"안녕, 아미고!"

"안녕, 리시!"

"오늘 수업의 주제는 소켓입니다."

"네트워크의 모든 컴퓨터에는 고유한 IP 주소가 있다는 것을 이미 알고 있습니다."

"네."

"이제 인터넷에 액세스하는 Skype, ICQ 등의 프로그램을 각각 실행하는 여러 대의 컴퓨터가 있다고 상상해 보십시오."

"그리고 이 프로그램들은 서로 통신하기를 원합니다."

"그들이 서로 간섭하는 것을 막아야 합니다. Skype가 Skype와 연결되고 Slack이 Slack과 연결되도록 만들어야 합니다."

"URL과 웹 서버로 이 문제를 어떻게 해결했는지 기억하십니까?"

"예, 포트를 추가했습니다."

"정확히."

"집 안에 작은 방을 잔뜩 만들고 그 집이 아파트라고 하는 것과 같다. 각 항구는 별도의 아파트와 같다. "

"IP 주소가 컴퓨터의 고유 식별자라면 포트와 결합된 IP 주소는 프로그램이 상주할 수 있는 컴퓨터의 특정 '아파트'에 대한 고유 식별자입니다. "

"이 고유한 위치를 소켓 이라고 합니다 ."

"소켓 에는 IP 주소와 포트 번호로 구성된 고유 번호가 있습니다 . "

"아. 즉, 소켓은 프로그램이 상주할 수 있는 가상 컴퓨터 위치에 대한 식별자입니까? 그리고 또 다른 프로그램은 이 위치에 메시지를 보내 두 프로그램이 통신할 수 있도록 합니까?"

"어떻게 이해하셨는지 모르겠지만 정확히 맞습니다."

"내 로보센스가 말해줬어."

"좋습니다. 그럼 자세한 내용을 알려드리겠습니다."

"소켓은 실제로 프로그램이 통신하는 가장 기본적이고 원시적인 방법입니다."

"Java에는 소켓 작업을 위한 두 가지 클래스가 있습니다. 그것들은 SocketServerSocket 입니다 ."

" ServerSocket은 개체가 서버를 나타내는 특수 클래스입니다. 즉, 특정 소켓에 도착하는 서비스 요청을 제공할 수 있습니다."

" Socket 클래스는 실제로 클라이언트 소켓입니다. 이를 사용하여 다른 소켓에 메시지를 보내고 응답을 받습니다."

"소켓에 메시지를 보내는 방법은 다음과 같습니다."

// Create a socket
Socket clientSocket = new Socket("localhost", 4444);

// Get an OutputStream
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();

// Read the response
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();

"인터넷에서 파일을 다운로드하는 것과 매우 유사합니다."

"그건, 얘야, 거기도 소켓을 사용하기 때문이야."

"소켓은 네트워크와 관련된 모든 것, 거의 모든 것의 중심에 있습니다."

" 여기에서 추가 정보를 읽을 수 있습니다. "

"수업 고마워, 리시."

"아직 안 끝났어. 그건 희망사항이야."

"이제 서버 소켓이 어떻게 작동하는지 살펴보겠습니다."

"조금 더 복잡합니다."

// Create a server socket object
ServerSocket serverSocket = new ServerSocket(4444); // Port

// Process incoming connections in a loop
while (true)
{
 // The accept method waits for someone to connect
 Socket socket = serverSocket.accept();

 // Read the response
 InputStream inputStream = socket.getInputStream();
 BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
 String message = in.readLine();

 // Create a response - we'll just reverse the string
 String reverseMessage = new StringBuilder(message).reverse().toString();

 // Send the response
 OutputStream outputStream = socket.getOutputStream();
 PrintWriter out = new PrintWriter(outputStream, true);
 out.println(reverseMessage);
 out.flush();
}

"몇 가지 사항에 주의를 기울이고 싶습니다."

"포인트 1: (클라이언트) 소켓을 생성하려면 IP 주소(또는 도메인 이름)와 포트를 지정해야 합니다. 서버 소켓을 생성하려면 포트만 지정하면 됩니다. 서버 소켓은 해당 컴퓨터에만 존재합니다. 그것은 창조되었다."

"포인트 2: ServerSocket 클래스에는 들어오는 연결을 기다리는 accept() 메서드가 있습니다. 즉, 이 메서드는 일부 클라이언트 소켓이 연결을 시도할 때까지 계속 실행됩니다. 그러면 accept() 메서드가 연결을 수락하고 소켓을 생성합니다. 통신을 허용한 다음 이 개체를 반환합니다."

"Java 프로그래머의 관점에서 소켓은 메시지/데이터를 읽는 InputStream과 메시지/데이터를 쓰는 OutputStream의 두 가지 스트림입니다."

"서버 소켓을 만들면 실제로 다른 컴퓨터의 클라이언트 소켓이 연결할 수 있는 포트를 만드는 것입니다. 하지만 이렇게 하려면 우리 소켓의 포트 번호와 우리 컴퓨터의 IP 주소를 올바르게 지정해야 합니다. 음, 또는 도메인 이름."

"여기 흥미로운 예가 있습니다. 자세히 살펴보고 실행할 수 있습니다."

https://www.logicbig.com/tutorials/core-java-tutorial/http-server/http-server-basic.html

"거기 요점은 서버 소켓을 사용하여 브라우저에서 간단히 액세스할 수 있는 매우 원시적인 웹 서버를 작성하는 것입니다."

"와우! 웹 서버? 멋져요! 아주 자세히 연구하겠습니다."

"고마워, 리시."

"그게 다야, 아미고. 가서 진정해!"