[java]InetAddress(컴퓨터 주소 찾기), InetSocketAddress(단방향 채팅프로그램)=>TCP통신

2024. 8. 26. 23:31·JAVA

20240826수업

InetAddress
IP 주소를 다루기 위한 클래스. 주로 네트워크 프로그래밍에서 사용


 명령 프롬프트 앱을 열어서 ipconfig/all을 입력하면 무선 LAN 어댑터 Wi-Fi에서 mac주소(물리적 주소)와 ip내부주소(IPv4 주소,본인 컴퓨터)를 알 수 있다.

 

인터넷 주소:192.168.0.9

  • local : 나
  • remote:상대방
  • host:컴퓨터
  • server:서버-자료를 제공하는 컴
  • client:클라이언트-자료를 요청하는 컴
import java.net.InetAddress;	
import java.net.UnknownHostException;

public class InetAddressTest {

	public static void main(String[] args) {

		try {
			//win+r:cmd -> ipconfig/all로 확인가능
			InetAddress local = InetAddress.getLocalHost(); // 내 컴퓨터의 정보를 가져와서 내컴퓨터에 담는것를 의미함
			System.out.println("내 아이피 주소: " + local.getHostAddress());
			//IPv4주소:192.168.100.133(기본설정)
			
			//win+r:cmd -> nslookup daum.net
			System.out.println("다음의 ip 주소목록");
			InetAddress[] ia = InetAddress.getAllByName("daum.net");
			for (InetAddress inetAddress : ia) {
				System.out.println(inetAddress);
			}

		} catch (UnknownHostException e) {

			e.printStackTrace();
		}

	}

}

결과

참고하면 좋은 글
https://yozm.wishket.com/magazine/detail/1956/
 

주니어 개발자를 위한 엄청 쉬운 TCP/IP 4계층 이야기 | 요즘IT

이번 글에서는 이전 글 “택배 배송 과정으로 알아보는 엄청 쉬운 컴퓨터 네트워크”를 컴퓨터에서 일어나는 일로 가져와 설명해보도록 하겠습니다. 이전 글에서 저는 데이터가 4단계에 걸쳐

yozm.wishket.com

 

InetSocketAddress
  • TCP 통신의 개념
    TCP(Transmission Control Protocol)는 신뢰성 있는 데이터 전송을 제공하는 프로토콜입니다. 데이터가 전송되는 동안 오류 검사, 재전송, 순서 보장을 통해 데이터가 정확하게 전달되도록 합니다.

  • 구조
    서버: 클라이언트의 요청을 기다리고, 연결이 수립되면 데이터를 처리합니다.
    클라이언트: 서버에 연결 요청을 하고, 데이터를 송신하거나 수신합니다.

  • 통신 과정
    1.서버 소켓 생성
    ○ 서버는 특정 포트 번호를 바인딩하여 클라이언트의 연결 요청을 기다립니다.
       이때, 포트넘버의제한은 아래와 같습니다.
       *0~65535(64kbyte)
       *0~1023:well known 사용금지
       *6000~6500:hardware용 ex)임베디드, 비디오카드
       *45000번 이상 사용x
    ○ 예: ServerSocket serverSocket = new ServerSocket(15000);

    2.클라이언트 연결 요청
    ○  클라이언트는 서버에 연결 요청을 합니다.
    ○  예: socket.connect(new InetSocketAddress("서버_IP", 15000));

    3.연결 수립
    ○서버는 accept() 메서드를 사용하여 클라이언트의 연결을 수락합니다. 이때 새로운 소켓 객체가 생성되어 클라이언트와의 통신을 담당합니다.

    4.데이터 송신 및 수신
    ○ 서버: InputStream을 통해 클라이언트로부터 데이터를 수신하고, OutputStream을 사용하여 클라이언트에게 응답합니다.
    ○ 클라이언트: OutputStream을 통해 서버에 데이터를 송신하고, InputStream을 통해 서버의 응답을 수신합니다.

    5. 연결 종료
    데이터 송수신이 완료되면 각 측에서 소켓을 닫아 연결을 종료합니다.
  • 예제

0~65535(64kbyte)

0~1023:well known 사용금지

6000~6500:hardware용 ex)임베디드, 비디오카드

 

45000번 이상 사용x

0~65535(64kbyte)

0~1023:well known 사용금지

6000~6500:hardware용 ex)임베디드, 비디오카드

 

45000번 이상 사용x

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServer {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;

		try {
			serverSocket = new ServerSocket();
			serverSocket.bind(new InetSocketAddress(15000)); // 15000번 포트를 통신
			//소켓(Socket)과 포트 번호를 결합(bind)한다
			
			//자바는listen문법이 없다
			//대신 while뭉르 돌려서 바로accept로 감
			while (true) {
				System.out.println("연결을 기다림");
				Socket socket = serverSocket.accept();//전화를 받는다
				InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
				System.out.println("[연결 수락됨]" + isa.getHostName() + isa.getAddress());

				// data 수신
				InputStream is = socket.getInputStream();
				byte[] bytes = new byte[1024];//byte배열

				int readByteCount = is.read(bytes);//받은 바이트가 
				// byte [] -> String
				String msg = new String(bytes, 0, readByteCount, "UTF-8");//읽어들인 byte값을 utf-8로 받아서 문자열로 바꿈
				System.out.println(msg);

				// data 송신
				OutputStream os = socket.getOutputStream();
				msg = "애옹";

				// String -> byte[];
				bytes = msg.getBytes("UTF-8");
				os.write(bytes); // 클라이언트에 내보낸다
				os.flush(); // 버퍼에 남아있는 데이터를 전부 내보내어 clear 한다
				System.out.println("서버도 보낸다");

				is.close();
				os.close();
				socket.close();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

		// 서버 소켓 close
		if (!serverSocket.isClosed()) {
			try {
				serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}

server의 코드

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class TestClient {
	
	//TCP방식

	public static void main(String[] args) {
		Socket socket = null;
		try {
			socket = new Socket();
			System.out.println("[서버에 연결 요청]");

			InetSocketAddress isa = new InetSocketAddress("192.168.100.133", 15000);// 15000번 포트를 충전
			socket.connect(isa); //전화를 건다
			System.out.println("[서버에 연결 성공]");

			// 서버에 data 보내기
			byte[] bytes = null;
			OutputStream os = socket.getOutputStream(); //os:byte data를 보내는 통로
			String msg = "애옹";
			bytes = msg.getBytes(); //문자열을 byte배열로 바꾼다
			os.write(bytes);
			os.flush(); //버퍼에 남아있는 데이터를 보내라(서버로)
			System.out.println("[데이터를 서버에 보냈습니다]");

			// 서버에서 data 받기
			InputStream is = socket.getInputStream();
			bytes = new byte[1024];
			int readBytesCount = is.read(bytes);
			msg = new String(bytes, 0, readBytesCount, "UTF-8");
			System.out.println("서버가 보낸거:" + msg);

			is.close();
			os.close();
			socket.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

client의 코드

  • 예제 요약
    ☞클라이언트가 "애옹"이라는 메시지를 서버에 전송.
    ☞ 서버는 이 메시지를 수신하고, 다시 "애옹"이라는 응답을 클라이언트에 전송.
    ☞ 클라이언트는 서버로부터 응답을 받고 출력합니다.

 

참고
tcp 4계층 
https://carnival.tistory.com/58
 

OSI 7계층과 TCP/IP 4계층

OSI 7계층 OSI 7계층이란, 통신 접속에서 완료까지의 과정을 네트워크 통신을 구성하는 요소들에 따라 7단계로 정의한 국제 통신 표준 규약이다. 이를 통해 계층별 기능과 통신 과정을 단계별로 파

carnival.tistory.com

socket  프로그래밍
1. tcp 방식
 https://recipes4dev.tistory.com/153#google_vignette
 

소켓 프로그래밍. (Socket Programming)

1. 소켓(Socket) 만약 네트워크와 관련된 프로젝트를 진행하면서, 사용자(User)의 관점이 아닌, 개발자(Developer)의 관점에서 네트워크를 다뤄본 경험이 있다면, "소켓(Socket)"이라는 용어가 아주 낯설

recipes4dev.tistory.com

2. udp 방식
https://sharpcoder.tistory.com/34
 

소켓 프로그래밍 기초 실습 - UDP편

이번에는 소켓 프로그래밍을 UDP로 실습해보겠습니다. 첫 번째 포스팅에서 언급했던 UDP를 살펴보면 다음과 같습니다. UDP - 비신뢰적 전송(unreliable transfer) 이므로 데이터 손실이 발생할 확률이 높

sharpcoder.tistory.com

 

'JAVA' 카테고리의 다른 글

[java] 클래스 활용  (1) 2024.10.10
[java]접근제어자  (0) 2024.08.26
[java]Thread(스레드)  (0) 2024.08.26
[java] 외부파일을 읽어서 출력하기(FileReader,BufferedReader,FileWriter,BufferedWriter)  (0) 2024.08.24
[java]Collection Framework  (3) 2024.08.22
'JAVA' 카테고리의 다른 글
  • [java] 클래스 활용
  • [java]접근제어자
  • [java]Thread(스레드)
  • [java] 외부파일을 읽어서 출력하기(FileReader,BufferedReader,FileWriter,BufferedWriter)
라텐느
라텐느
이제 막 개발을 시작한 초보가 개인공부를 하는 공간입니다.
  • 라텐느
    괴발개발
    라텐느
    • 개발자 (154)
      • HTML|CSS (14)
      • JAVA (29)
      • JAVACSCRIPT (15)
      • SQL (16)
      • 기타 (5)
      • JSP (2)
      • SPRING (13)
      • SPRING BOOT (6)
      • Git&GitHub (1)
      • 시행착오 (2)
      • 개발일지 (35)
        • GreenMiniProject1 (12)
        • GreenMiniProject2 (9)
        • GreenFinalProject (14)
      • Flutter (5)
      • 자격증 (0)
        • SQLD (1)
      • AWS (2)
      • Linux (1)
      • 자료구조&알고리즘 (4)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 태그
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    JS
    input
    tag
    개발자
    AJAX
    티스토리챌린지
    link
    java
    HTML
    링크
    javascript
    JQuery
    부트캠프
    CSS
    태그
    db
    오블완
    일지
    자기계발
    SQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
라텐느
[java]InetAddress(컴퓨터 주소 찾기), InetSocketAddress(단방향 채팅프로그램)=>TCP통신
상단으로

티스토리툴바