안드로이드 개발자의 창고
[10일차 Java] Network 본문
출처 : 안드로이드 앱스쿨 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 |