ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 특정 컴퓨터 접속 후 메세지 전달 (+ 사용중인 포트번호,taskkill, 서버 접속)
    JAVA/Network 2024. 6. 21. 11:05

    ▤ 목차

       

      ✔사용중인 포트번호 확인방법

      포트(port) 논리적인 접속 장소를 의미한다.( 직역하면 '항구'라는 의미)

      인터넷 프로토콜인 tcp(4계층)/ip(3계층)를 사용할 때 클라이언트 프로그램이 네트워크 상에서 특정 서버 프로그램을 지정하는 방법을 사용한다. 운영 체제 통신에서 종단점이다.

      네트워크 상에서 통신을 할때 IP주소를 바탕으로 해당 서버가 있는 컴퓨터에 접근하게 된다.

       

      데이터가 받을 프로세스(process)가 어떤 것인지 알아야 데이터가 제대로 전송이 될 것이다. 이때 사용하는 것이 port number라 한다. 식별자이다.

       

      1. Datalink 계층(2계층)에서 호스트의 NIC로 MAC Address를 판별하고
      2. Netwok 계층(3계층)에서는 IP Address로 목적지를 판별해 도달한다.
      3. 이후, 어떤 프로세스에서 데이터를 받을 것인지 알아야하는데 이때, Port Number가 사용된다.

       

      ⌨ 컴퓨터에 사용중인 포트번호 확인 (java)

      public class Net4TestServer {
      
      	public static void main(String[] args) {
      		// 단순 서버 (요청 받고 보내버린다.)
      		ServerSocket ss = null;
      		
      		//내 컴퓨터가 사용중인 port number 확인
      		
      		for (int i = 0; i < 65536; i++) {
      			try {
      				ss=new ServerSocket(i); //이미 소켓을 사용중이면 err
      				ss.close();
      			} catch (Exception e) {
      				System.out.println(i+"번 port는 사용중");
      			}
      		}
      	}
      }

       

       

      포트번호를 확인하고 자신이 사용하지 않는 포트번호를 선택해서 사용하자.

      만약 자신이 사용하고 있는 포트번호를 사용하면 충돌이 일어난다.

      이때는 taskkill을 사용해야한다.

       

       

      🔪   프로세스 강제 종료 (pid 사용)

      taskkill은 프로세스를 강제 종료하는 명령어이다.

      포트번호가 중복되는 경우 애플리케이션이 실행이 안되는 경우가 있다.

      이런 경우 중복되는 포트번호를 먼저 찾아서 프로세스를 제거해야한다.

      (예를 위해 메모장을 닫아보겠다.)

       

      1. cmd를 권리자 권한으로 실행 (cmd에서 우클릭 > 관리자 권한)

      1-1. 메모장 열기

      notepad

       

      2.

      netstat -ano

      netstat 명령어는 네트워크 연결 상태, 라우팅 테이블, 인터페이스 상태 등을 보여주는 명령어이다.

      하지만 이렇게 보니 어떤 프로그램이 어떤 포트를 사용하는지 알 수 없다.

       

      3. tasklist

      tasklist

       

      이 곳에서 메모장을 찾아서 pid를 찾아보자.

       

       

       

      4. 

      taskkill /f /pid PID번호

       

      해당 연결된 프로세스가 종료되었다.

       

       


       

       

       

      포트번호는 9999번으로 사용한다.
      클라이언트가 접속해서 메세지를 보내면 서버는 바로 죽을 것이다.
      실질적은 서버의 역할을 하지 못하는 코드이지만 socket을 명시적으로 보기위한 것이다.
      socket을 직접 지정하는 일이 많지 않으니 내부적으로 어떻게 돌아가는지 아는 것이 중요하다.

      Server

      1) 클라이언트의 요청을 받기 위해 준비한다.

      2) 클라이언트가 특정 Socket 번호를 들고 접속을 요청하면 클라이언트의 요청을 받아드린다(accept).

       

      클라이언트와 서버가 연결 후

       

      3-1)  클라이언트가 서버에 메세지를 보낸다(BufferedWriter).

      클라이언트로부터 받은 데이터를 출력(ButteredReader)한다.

       

      3-2) 클라이언트에게 메세지를 보낸다(BufferdeWriter).

      서버가 보낸 메시지를 출력(BufferedReader)한다.

       

      4) 통신이 끝나면 Socket을 닫는다.(.close())

       

      ⌨코드

      public class Net4TestServer {
      
      	public static void main(String[] args) {
      		// 단순 서버 (요청 받고 보내버린다.)
      		ServerSocket ss = null;
      		
      		Socket socket = null;
      		//TCP 기반의 통신용 클래스(파일) /A socket is an endpoint for communication between two machines.
      		
      		try {
      			ss = new ServerSocket(9999); //서버 소켓
      			System.out.println("서버 서비스 시작 ..");
      			socket = ss.accept(); //서버 소켓으로부터 클라이언트 컴과 통신하기 위한 개별 소켓 생성
      			//클라이언트가 요청하기를 기다리고 있다.(무한루프)
      			
      			BufferedReader reader = new BufferedReader(
      					new InputStreamReader(socket.getInputStream(),StandardCharsets.UTF_8));
      			String data = reader.readLine();
      			System.out.println("tntls : " + data); //클라이언트가 자료를 전달하면 바로 서버 죽는다.
      			
      			reader.close();
      			socket.close();
      			ss.close();
      		} catch (Exception e) {
      			System.out.println("server err"+e);
      		}
      	}
      
      }

       

       

      더보기

      close를 따로 해야하는게 명시적이지만 auto-Closeable가 구현되어 있는 것을 보니 아래와 같이 짤 수 있다.

       

       

       

       

       

       

       

       

       

      💻 ServerSocket

      Socket이란 프로세스가 데이터를 주고 받을 수 있도록 연결해주는 통신의 종착점이다.

      OSI 7계층 중 응용 계층에 속하는 프로세스들은 데이터 송수신을 위해 반드시 소켓을 거쳐 전송 계층으로 데이터를 전달해야한다. 즉, 소켓을 전송 계층(4계층)응용 프로그램 사이의 인터페이스 역할을 하며 떨어져 있는 두 호스트를 연결해준다. 소켓은 IP, 프로토콜, Port 로 정의된다.

       

      https://helloworld-88.tistory.com/215

       

       

      👏 accept() 메서드

       

      소켓은 연결을 수신하고 연결을 수락한다.

      accept()가 호출되면 프로그램은 여기서 실행을 멈추고 클라이언트 포트가 연결 될때까지 무한 대기한다.

      무한 로딩에 빠진다. 서버는 일방적으로 당한다..? 클라이언트가 연결하고 클라이언트가 끊는다..

      클라이언트가 연결되면 accept() 메서드는 Socket 객체를 반환한다.

       

      accept() 실행 후 (클라이언트 접속 전) 무한 대기

       

       

       

       


       

       

      ✔ Client

      client는 서버에게 메세지를 보내고 받는다.

      연결을 요청하고 서버는 client가 올때까지 기다리다가 연결 후, 메세지를 보낸다.

      이후, 데이터의 전송이 마무리되면 일방적으로 연결을 끊는다.

      Socket번호는 개인 방화벽을 풀면 다른 사람과 소통할 수 있지만, 방화벽이 없어지니 위험하다.
      실습시 혼자 연습할 수 있도록, localhost 혹은 127.0.0.1을 사용하거나 루프백 주소(자신의 IPv4 주소)를 사용하자.

       

      ⌨ 코드

      public class Net4TestClient {
      
      	public static void main(String[] args) {
      		// 특정 컴퓨터의 접속 후 메세지 전달
      		try {			
      			Socket socket = new Socket("192.168.0.23", 9999); //서버 접속 (port번호)
      			PrintWriter writer = new PrintWriter(
      					new OutputStreamWriter(
      					socket.getOutputStream(),StandardCharsets.UTF_8),true); //buffered는 안쓰기로
      			writer.println("안녕 Client1"+"\n"); //서버로 자료 전송
      			
      			writer.close();
      			socket.close();
      			
      		} catch (Exception e) {
      			System.out.println("client err : "+e);
      		}
      	}
      }

       

      TCP를 사용하는 연결 지향 방식의 소켓스트림 소켓을 말한다.

      송수신자와 연결을 장하느여 신뢰성있는 데이커 송수신이 가능하다.

      데이터의 순서를 보장해준다.

      소량의 데이터보다 대량 데이터 전송에 적합하다.

       

       

      💻 코드로 보기

      InetAddress ia = InetAddress.getByName("127.0.0.1");
      System.out.println(ia);

       

       

       

       

       

       

      👏 직렬화?

       객체를 다른 컴퓨터의 자바로 전송하기 위해
      객체(Object or Data) → 바이트 스트림(stream of bytes) 형태로 변환하는 기술이다.

      보통 직렬화 계산에는 cpu가 관여한다.

       

      이 반대의 개념을 `역직렬화`라고하는데 

      바이트 스트림(stream of bytes) 객체(Object or Data) 형태로 변환하는 기술이다.

       

      JVM의 힙영역과 스택 메모리에 상주하고 있는 객체 데이터를 직렬화를 통해 바이터 형태로 벼환해서 데이터베이스나 파일과 같은 외부 저장소에 저장한 후 파일을 가져와 역직렬화 하여java 객체로 변환 후 JVM 메모리에 적재하는 것이 좋다.

      바이트 스트림
      스트림은 클라이언트와 서버간의 입출력하기 위한 데이터가 흐르는 통로를 말한다. 스트림의 기본 단위를 바이트로 두고있다.

       

      • 자바 직렬화란 자바 시스템에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 Byte 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터들을 다시 객체로 변환하는 역직렬화 기순이다.
      • 시스템적으로 JVM이나 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환을 한다.
      • 직렬화 변환하는 기술과 질렬화 된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태

       

      언제 사용하는가?

      1. 데이터 직려로하 외에도 CSV, XML,JSON으로 직렬화 작없도 존재한다.
      2. CSV를 많이 이용하고 네트워크에서 구조적인 데이터를 송수신할 대, 대부분 JSON을 많이 사용한다.
      3. 자바의 직렬화는 같은 자바 시스템에서의 데이터 전송, 저장에 최적화 되어있다.
      4. 데이터 구조가 복잡하더라도 직렬화의 기본 조건만 지키면 직렬화와 역직렬화가 가능하다.

       

       

       

       

      결과 보기

      1. 실행 코드(server / client 2개 다) .jar파일로 export하기

       

       

      🔷server 실행

       

       

      1) 서버에 접속자가 접속자명을 입력한 경우

       

       

       

      🔷client 실행

      1) 접속자 명을 입력

       

       

       

      하나의 컴퓨터에 여러명이 접속하려면,

      client 클래스에서 ip를 몰아주면된다.

      자신의 ip 찾는법
      cmd창에 들어가서 ipconfig를 적어주면 된다.


       

       

      😊정리

       

      https://inpa.tistory.com/entry/WEB-IP-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%84%9C%EB%B8%8C%EB%84%B7-%EB%A7%88%EC%8A%A4%ED%81%AC-%EC%84%9C%EB%B8%8C%EB%84%B7%ED%8C%85-%EC%B4%9D%EC%A0%95%EB%A6%AC

       

      🌐 IP 클래스 · 서브넷 마스크 · 서브넷팅 계산법 💯 총정리

      아이피(IP) 정리 IP(Internet Protocol) 란 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록 각각의 장비에게 부여되는 고유 주소이다. 아이피(ip)는 일반적으

      inpa.tistory.com

       

    Designed by Tistory.