Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[10일차 Java] Network 본문

Computer/Java

[10일차 Java] Network

Wise-99 2023. 5. 10. 18:35

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Network란?

  • 원격지의 컴퓨터와 데이터를 송수신하는 것을 네트워크라고 부른다.
  • 자바에서는 서버 프로그래밍을 할 수 있는 도구들과 클라이언트 프로그래밍을 할 수 있는 도구들을 제공한다.
  • 제공되는 도구들을 이용해 입출력 스트림을 추출하고 추출한 스트림을 통해 데이터를 송수신하면 된다.

 

📖 반드시 알아야 할 용어

      • 서버 : 서비스를 제공하는 프로그램이다. 클라이언트가 요구하는 데이터를 클라이언트로 전송하는 역할을 한.
      • 클라이언트 : 서비스를 받는 프로그램이다. 서버가 보낸 데이터를 바탕으로 사용자가 서비스를 이용할 수 도록 구성해주는 역할을 한다.
      • IP : 컴퓨터 시스템이 가지고 있는 주소이다. 전 세계 의 컴퓨터는 전부 아이피 주소를 가지고 있다. 아이피 주소가 공인 아이피일 경우 다른 컴퓨터가 쉽게 접근해서 데이터 통신을 할 수 있다.. 공유기 등으로 연결되어 사설 아이피를 받았을 경우 외부에서의 접근을 위해서는 다른 방법을 이용해야만 한다.
      • 포트 : 하나의 컴퓨터에서 여러 개의 네트워크 프로그램이 동시에 운영될 수도 있다. 각 프로그램 별로 데이터를 올바르게 송수신 할수 있도록 문의 역할을 해주는 것을 하나씩 할당하게 되는데 이 것이 포트이다.
      • 소켓 : 하나의 서버에는 수십 수백의 클라이언트가 연결될 수 있는데 이런 클라이언트는 모두 같은 포트에 접속을 하게 된다. 따라서 서버는 클라이언트와 1:1의 연결 관계가 필요한데 이러한 연결 관계를 유지 시켜주는것이 소켓이다.

 

📖 Server 예제 코드

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerClass {

	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(30000);
			System.out.println("서버가동");

			Socket socket = server.accept();
			System.out.println(socket);

			OutputStream os = socket.getOutputStream();
			DataOutputStream dos = new DataOutputStream(os);

			dos.writeInt(100);
			dos.writeDouble(11.11);
			dos.writeBoolean(true);
			dos.writeUTF("서버가 보낸 문자열");

			InputStream is = socket.getInputStream();
			DataInputStream dis = new DataInputStream(is);

			int data1 = dis.readInt();
			double data2 = dis.readDouble();
			boolean data3 = dis.readBoolean();
			String data4 = dis.readUTF();

			System.out.println(data1); // 200
			System.out.println(data2); // 22.22
			System.out.println(data3); // false
			System.out.println(data4); // 클라이언트가 보낸 문자열

			socket.close();
			server.close();

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

✔️ 코드 해석

ServerSocket server = new ServerSocket(30000);
  • ServerSocket 객체를 생성한다.
  • 프로그램이 사용할 포트 번호를 지정한다. 해당 코드에서는 포트번호 30000을 사용한다.

 

 

 

Socket socket = server.accept();
  • 사용자 접속을 대기한다.
  • 사용자가 접속할 때까지 대기하여 접속에 성공하면 접속한 클라이언트와 1:1로 연결되어있는 socket이 생성된다.

 

 

 

 

OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);

dos.writeInt(100);
dos.writeDouble(11.11);
dos.writeBoolean(true);
dos.writeUTF("서버가 보낸 문자열");
  • OutputStream과 DataOutputStream을 이용하여 클라이언트에게 서버를 전송한다.

 

 

 

InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);

int data1 = dis.readInt();
double data2 = dis.readDouble();
boolean data3 = dis.readBoolean();
String data4 = dis.readUTF();
  • InputStream과 DataInputStream을 이용하여 클라이언트에게 데이터를 전송한다.

 

 

 

socket.close();
server.close();
  • 클라이언트와의 연결을 종료한다.
  • 서버를 종료한다.

 

 

 


📖 Client 예제 코드

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ClientClass {
	public static void main(String[] args) {
		try {
			Socket socket = new Socket("127.0.0.1", 30000);
			System.out.println(socket);

			InputStream is = socket.getInputStream();
			DataInputStream dis = new DataInputStream(is);

			int data1 = dis.readInt();
			double data2 = dis.readDouble();
			boolean data3 = dis.readBoolean();
			String data4 = dis.readUTF();

			System.out.println(data1); // 100
			System.out.println(data2); // 11.11
			System.out.println(data3); // true
			System.out.println(data4); // 서버가 보낸 문자열

			OutputStream os = socket.getOutputStream();
			DataOutputStream dos = new DataOutputStream(os);

			dos.writeInt(200);
			dos.writeDouble(22.22);
			dos.writeBoolean(false);
			dos.writeUTF("클라이언트가 보낸 문자열");

			socket.close();

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

✔️ 코드 해석

Socket socket = new Socket("127.0.0.1", 30000);
  • 서버에 접속한다. 이 때, IP 주소와 포트 번호를 설정해줘야 한다.
  • 127.0.0.1
    • 자기 자신 컴퓨터를 가르키는 IP주소
    • 서버와 클라이언트를 같은 컴퓨터에서 개발할 때 사용하는 테스트용 IP 주소

 

 

 

InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);

int data1 = dis.readInt();
double data2 = dis.readDouble();
boolean data3 = dis.readBoolean();
String data4 = dis.readUTF();
  • InputStream과 DataInputStream을 선언한다.
  • 서버가 보낸 데이터를 받는다.

 

 

 

OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);

dos.writeInt(200);
dos.writeDouble(22.22);
dos.writeBoolean(false);
dos.writeUTF("클라이언트가 보낸 문자열");
  • OutputStream과 DataOutputStream을 이용하여 서버에게 데이터를 보낸다.

 

 

 

socket.close();
  • 접속 해제
  • socket을 닫으면 스트림도 닫아진다.

'Computer > Java' 카테고리의 다른 글

[Java 9일차] ObjectStream  (0) 2023.05.09
[9일차 Java] 2ByteStream  (0) 2023.05.09
[9일차 Java] DataStream  (0) 2023.05.09
[9일차 Java] FileStream  (0) 2023.05.08
[8일차 Java] Collection / List / Map / Set  (0) 2023.05.07