네트워크 대상 사이에 입.출력(InputStream / OutputStream)을 이용해서 데이터를 입력하고 출력합니다.
네트워크 대상이라고하면 객체를 말하는데요.
네트워크를 이용한 네트워크에서 이루어지는 데이터 전송을 네트워크 데이터 입력, 출력이라고 합니다.
그런데 네트워크 상에서 데이터를 주고 받기위한 장치로 소켓(Socket)을 사용합니다.
소켓이란 무엇일까요?
A라는 객체와 B라는 객체가 있다고 가정했을때 A에서 입력 B에서 출력을 하는 것을 네트워크 데이터 전송이라고 하는데 서로 다른 객체간에 데이터를 입력하고 출력하는 장치를 소켓이라고합니다.
쉽게 생각하면 전화기라고 생각하면 됩니다.
내가 누군가한테 전화를 하게 된다면 전화를 하기위한 장치가 필요하죠.
그 장치가 전화기이며 네트워크에서는 소켓이라고 할 수 있습니다.
자바에서는 소켓 클래스를 제공해주기때문에 소켓이라는 클래스를 살펴보면 쉽게 네트워크 데이터 전송을 할 수 있습니다.
소켓 클래스는 어떻게 이루어져 있을까요?
서버는 클라이언트를 맞을 준비를 하고 있다가 클라이언트의 요청이오면 이에 반응합니다.
어떤 데이터를 요청하는 곳을 클라이언트라고 하고 요청에대한 데이터를 제공하는 곳을 서버라고합니다.
이는 쉽게 생각하면 크롬이나 엣지 같은 브라우저를 열어서 네이버, 구글, 다음 등의 포털 사이트를 열게 됩니다.
이가 클라이언트가 하는 행위입니다.
브라우저에서 다음, 구글, 네이버에 요청이 갔다면 다음이나 구글, 네이버의 서버에서는 이를 응답해주고 브라우저에 화면을 띄워주게 됩니다.
클라이언트에서는 소켓을 만들어서 서버에 요청하게되고 서버에서는 서버소켓을 만들어서 데이터를 넘겨주게 됩니다.
import java.net.ServerSocket;
import java.net.Socket;
public class MainCLass {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(9000);
System.out.println("클라이언트 맞을 준비 완료!!");
socket = ServerSocket.accept();
System.out.println("클라이언트 연결!!");
System.out.println("socket : " + socket);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(socket != null) socket.close();
if(serverSocket != null) serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
우선 네트워크 관련된 작업은 99%이상 예외처리를 해주어야합니다.
예외처리를 해주지 않으면 에러가 발생하게 됩니다.
위의 코드를 실행하면 먼저 클라이언트 맞을 준비 완료!! 라는 문자가 출력이 되고 브라우저에서 http://localhost:9000 번으로 요청을 하게되면 서버에서 응답을 하게 됩니다.
코드에서는 응답하는 내용이 없기 떄문에 화면은 생성되지 않지만 응답을 한것은 볼수가 있습니다.
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class TestClient {
public static void main(String[] args) throws IOException {
//송신소켓 만듬
DatagramSocket ds = new DatagramSocket();
System.out.println("클라이언트 입니다.");
//보낼 메세지를 저장한 패킷을 생성
byte[] buff = "연습입니다.".getBytes();
//송신을 위한 전송용 패킷 생성
DatagramPacket sendP = new DatagramPacket(buff, buff.length, InetAddress.getByName("localhost"),8888);
//데이터 전송
ds.send(sendP);
ds.close();
ds.disconnect();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TestServer {
public static void main(String[] args) throws IOException {
//수신 소켓을 만금 -> 8888번 포트로 들어오는 데이터를 수신
DatagramSocket ds = new DatagramSocket(8888);
System.out.println("서버입니다.");
//1024공간의 바이트배열 버퍼를 만듬
byte[] buff = new byte[1024];
//수신한 데이터를 저장할 패킷을 생성
DatagramPacket receiveP = new DatagramPacket(buff, buff.length);
//생성한 소켓과 패킷을 이용하여 데이터 수신
ds.receive(receiveP);
//수신된 결과를 패킷에 저장, 수신한 메세지를 문자열로 변환
System.out.println(new String(receiveP.getData()));
ds.close();
ds.disconnect();
}
}
위의 코드가 데이터를 송신하는 클라이언트라고 볼 수 있고 아래의 코드가 데이터를 수신하는 서버라고 볼수 있습니다.
각 코드의 설명은 주석으로 달아 놓은 것처럼 동작이 되는데요.
한번 로컬에서 직접 실행해 보시면 이해가 조금 더 쉬울것입니다!
'Java 관련 > Java' 카테고리의 다른 글
[Java] 복사 Copy(FileInputStream / FIleOutputStream) (0) | 2022.08.03 |
---|---|
[Java] FileOutputStream (0) | 2022.08.02 |
[Java] FileInputStream (0) | 2022.08.01 |
[Java] Static(스태틱) (0) | 2022.07.31 |
[Java] import(임포트) (2) | 2022.07.30 |