원격지의 컴퓨터와 데이터를 송수신하는 것.
데이터에 여러 컴퓨터가 접근할 수 있는 환경을 위해.
서버 : 서비스를 제공하는 프로그램으로 클라이언트가 원하는 데이터를 보내준다.
클라이언트 : 서비스를 받는 프로그램으로 서버로부터 데이터를 받아 사용자에게 표시하거나 요청한 작업을 수행한다.
IP : 컴퓨터 시스템이 가지고 있는 주소. 공인 IP일 경우 다른 컴퓨터가 쉽게 접근해서 데이터 통신을 할 수 있지만 공유기 등으로 연결되어 사설 IP를 받았을 경우 외부에서의 접근을 위해서는 다른 방법을 이용해야만 한다.
포트 : 컴퓨터의 네트워크 통신에서 프로세스 또는 서비스를 식별하기 위한 번호. 하나의 컴퓨터에서 여러 개의 네트워크 프로그램이 동시에 운영될 수도 있다.
소켓 : 컴퓨터 네트워크에서 프로그램 간의 양방향 통신을 위한 인터페이스. 서버와 클라이언트는 1:多의 관계가 가능한데 모두 같은 포트로 들어온다. 각 클라이언트와 1:1의 연결 관계를 유지 시켜주는것이 소켓이다.
서버
public class ServerClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// ServerSocket 객체를 생성
// 프로그램이 사용할 포트 번호를 지정
// 0에서 65535까지의 포트 번호가 있다.
ServerSocket server = new ServerSocket(30_000);
System.out.println("서버 가동");
// 사용자 접속을 대기한다.
// 사용자가 접속할 때까지 대기하며 접속에 성공하면
// 접속한 클라이언트와 1:1로 연결되어 있는 Socket이 생성된다.
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);
System.out.println(data2);
System.out.println(data3);
System.out.println(data4);
// 클라이언트와의 연결을 해제한다.
socket.close();
// 서버 종료
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
클라이언트
public class ClientClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// 서버에 접속한다.
// 이때, IP 주소와 포트 번호를 설정해줘야 한다.
// 127.0.0.1 : 자기 자신 컴퓨터를 가르키는 IP주소
// 서버와 클라이언트를 같은 컴퓨터에서 개발할 때 사용하는
// 테스트용 IP 주소
Socket socket = new Socket("192.168.0.5", 30_000);
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);
System.out.println(data2);
System.out.println(data3);
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();
}
}
}