통신(단방향)

#버퍼 타겟 #파일 경로 #상대경로 #절대경로 #socket #단방향 통
hyeonn's avatar
Jan 09, 2024
통신(단방향)

버퍼 타겟 (파일의 경로)

  • 상대 경로 - 실행되는 위치를 기반으로 경로를 정하는 것
  • 절대 경로 - 루트에서부터 경로를 찾는 것
    • ⇒ 파일 실행 시 src에 있는 파일이 아니라 out에 있는 파일에서 실행
  • 컴파일 실행 시 파일이 out에 생성 → context는 프로젝트 내부에서 실행
  • 윈도우 → c:\workspace\hello.txt - 최상위 경로로 시작
  • 맥, 리눅스 → \workspace\hello.txt
// 상대 경로 : 내 파일(.class)에 위치를 기반으로 경로 정하는 것 // 절대 경로 : 루트에서 부터 경로를 찾는 것 // 윈도우 : C:\workspace\hello.txt // 맥,리눅스 : /workspace/hello.txt public class StreamEx05 { public static void main(String[] args) { try { // 절대경로 //BufferedReader br = new BufferedReader(new FileReader //("D:\\workspace\\java_lec\\study\\out\\production\\study\\ex\\ex15\\hello.txt")); // 상대경로 BufferedReader br = new BufferedReader(new FileReader ("src\\ex\\ex15\\hello.txt")); String line = br.readLine(); System.out.println(line); BufferedWriter bw = new BufferedWriter(new FileWriter("input.txt")); bw.write("안녕"); bw.write("반가워\n"); bw.flush(); } catch (Exception e) { e.printStackTrace(); } } }
💡
절대 경로와 상대 경로 확인 방법
notion image
상단 - 절대 경로 / 하단 - 상대 경로
상단 - 절대 경로 / 하단 - 상대 경로
💡
상대 경로 확인
notion image
notion image
 

통신

Simplex (단방향)

  • 프로토콜은 서로 알려줘야 함
Client - 요청을 위해 ip주소, port번호 필요
Server - 갑
Client - 요청을 위해 ip주소, port번호 필요 Server - 갑

socket (최소 2개 필요)

  • 외부 컴퓨터랑 연결하기 위해서는 file이 socket이 되어야 한다.
  • socket이 많으면 타겟 설정 가능
  • 클라이언트가 요청하면 연결되는 serve socket을 자동 생성
  • thread도 socket 생성과 함께 필요
  • socket은 모두 port를 가진다.
    • S → socket / SS → serve socket
client + 1 = thread, socket 개수
      S → socket / SS → serve socket client + 1 = thread, socket 개수

port

패킷으로 경로 확인 → PC 내부의 어떤 프로그램과 통신 할지 확인 필요
→ port로 통신 연결 경로 확인 가능
패킷으로 경로 확인 → PC 내부의 어떤 프로그램과 통신 할지 확인 필요 → port로 통신 연결 경로 확인 가능
 
  • 서버는 외부 전봇대 선을 바로 연결해야 실행 가능
  • 외부선을 wi-fi(공유기)에 연결해서 공인 IP를 받아 각 PC의 port에 따라 서버 사용
    • IP - 도착지
      IP - 도착지
 

단방향 예제

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(10000); Socket socket = serverSocket.accept(); // 리스너 System.out.println("클라이언트 연결됨"); BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream(), "UTF-8") ); while (true) { String msg = br.readLine(); if (msg == null) break; System.out.println(msg); } } catch (IOException e) { throw new RuntimeException(e); } } }
실행하면 리스너에서 요청을 대기한다. main thread가 리스너 역할을 하며 받은 요청 처리
import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.Socket; public class Client { public static void main(String[] args) { // localhost = 127.0.0.1 (루프백) try { Socket socket = new Socket("127.0.0.1", 10000); // 가나다라abc // 보조 스트림 생성 = 보조 스트림에 버퍼 설정으로 감싸기 //(소켓 방향 설정, UTF-8로 읽을 수 있게 설정) BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), "UTF-8") ); bw.write("msg1" + "\n"); bw.write("msg2" + "\n"); bw.flush(); } catch (IOException e) { e.printStackTrace(); } } }
요청을 보내면 요청을 확인하고 출력한다.
실행방법
Server 클래스에서 Current File로 실행
Server 클래스에서 Current File로 실행
실행 후 클라이언트의 요청을 대기하는 것을 확인 가능
실행 후 클라이언트의 요청을 대기하는 것을 확인 가능
실행 상태로 Client 클래스 실행
실행 상태로 Client 클래스 실행
Run 실행이 Server, Client 같이 되는 것을 확인 가능
Run 실행이 Server, Client 같이 되는 것을 확인 가능
Client의 Scanner로 안녕을 입력
Client의 Scanner로 안녕을 입력
Server에 입력이 된 것을 확인 가능
Server에 입력이 된 것을 확인 가능
 
💡
루프백 IP - 자신의 컴퓨터를 의미하는 키워드 ⇒ 127.0.0.1
💡
개발할 때 printStackTrace 사용해서 오류를 자세히 보는 것이 좋다.
Share article

from-web-developer