[Java] 네트워크 프로그래밍

kimwoody·2021년 8월 28일
0

주요 클래스

ServerSocket, Socket

용어 정리

  • Protocol
    프로토콜, 약속, 통신규약
  • TCP(Transmission Control Protocol)
    전송제어 프로토콜
    신뢰성이 높다 -> 데이터 전달을 보증
  • IP(Internet Protocol)
    ip address -> 127.0.0.1 (localhost): 자신의 컴퓨터의 IP
  • Port
    가상의 연결단위, 서버의 서비스 번호(입구)
    ex) http://127.0.0.1:8888
    http: protocol
    127.0.0.1: IP
    8888: Port
  • Socket
    네트워크 연결의 양 끝단위(end-point)로서 통신을 하기 위한 인터페이스를 제공
    여러개의 소켓이 하나의 포트를 공유할 수 있다
Socket socket = new Socket(serverIp, port);
socket.getOutputStream(); // 출력 스트림
socket.getInputStream(); // 입력 스트림
  • ServerSocket
    통신 서버를 구현하기 위한 객체
    포트와 bind되어 포트를 통해 클라이언트의 연결 요청을 기다리다가 연결 요청이 올 때마다 새로운 소켓을 생성
    한 포트에 하나의 ServerSocket만 연결 할 수 있다
ServerSocket serverSocket = new ServerSocket(port);
// 접속을 대기하다가 클라이언트 접속하면 실행된다. 실행 후 일반 Socket을 반환한다
serverSocket.accept();
// 반환받은 일반 socket으로 실제 클라이언트와 통신하게 된다
// ServerSocket은 대표 전화, Socket은 상담원 전화기(실제 고객과 통신)

실습

  1. 서버는 클라이언트의 접속을 대기하다가 클라이언트가 접속하면 메세지를 출력
  2. 클라이언트는 서버가 출력한 메세지를 입력받아 콘솔에 출력
  3. 서버와 클라이언트에서 출력과 입력이 모두 완료되면 프로그램 종료

서버

package step1;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class NetServer1 {
	public void go() throws IOException {
		ServerSocket serverSocket = new ServerSocket(5432);
		
		System.out.println("**NetServer1 실행**");
		// ServerSocket의 accept(): 클라이언트 접속을 대기하다가 접속하면 그 클라이언트와 통신할 일반 Socket을 반환
		Socket socket = serverSocket.accept();
		System.out.println("**client가 접속함**");
		
		// 서버에서 접속한 클라이언트로 메세지를 출력한다
		PrintWriter out = new PrintWriter(socket.getOutputStream());
		out.println("즐거운 목요일 오후입니다");
		out.close();
		socket.close();
		serverSocket.close();
		
		System.out.println("**NetServer1 클라이언트에게 메세지 출력 후 종료**");
	}
	
	public static void main(String[] args) {
		NetServer1 server = new NetServer1();
		try {
			server.go();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

클라이언트

package step1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

import common.IP;

public class NetClient1 {
	public void go() throws UnknownHostException, IOException {
		Socket socket = new Socket(IP.LOCAL, 5432);
		System.out.println("**NetClient가 서버에 접속함**");
		// InputStreaReader: 8bit 스트림(바이트스트림)을 16bit 스트림(문자스트림)으로 변환
		InputStreamReader ir = new InputStreamReader(socket.getInputStream());
		BufferedReader br = new BufferedReader(ir);
		String message = br.readLine();
		System.out.println("서버가 보낸 메세지:" + message);
		br.close();
		socket.close();
		
		System.out.println("**NetClient 종료**");
	}
	
	public static void main(String[] args) {
		NetClient1 client = new NetClient1();
		try {
			client.go();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

0개의 댓글