728x90
소켓( socket ) 통신
소켓(socket)은 통신선 또는 전기선, 네트워크에 접속하게 하는 연결부를 뜻한다.
소켓 프로그래밍은 클라이언트(client)와 서버(server)가 통신할 수 있는 환경을 설계하는것이다.
클라이언트가 서버와 통신을 할 때, 그 서버의 특정 application 에 접근을 하기위해서는 소켓을 거쳐서 특정 port와 연결이 된다. 이러한 소켓 안에서 어떠한 방식으로 통신 할 것인지 설계하는 것이 소켓프로그래밍이다.
1:1 통신이 아니라 여러 클라이언트가 접속할때는 클라이언트에게 서비스를 제공하는 컴퓨터(ServerSocket) 안에 읽고쓰는 Thread(스레드)가 클라이언트의 port, socket 개수만큼 존재하여 동시에 통신할 수 있게 한다.
getInputStream() 메소드는 전송하는 데이터를 읽기위한 스트림객체를 Socket으로부터 생성하는 것이다.
getOutputStream() 메소드는 전송할 데이터를 출력하기위한 스트림객체를 Socket으로부터 생성하는 것이다.
예시로 콘솔창에 메세지로 통신하는 서버와 클라이언트 코드를 보도록하자.
한줄씩 해석은 주석으로 설명하였다.
파일명 : MyNetServer02.java
package networktest;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class MyNetServer02 {
public static void main(String[] args) {
Socket client = null;
InputStream is = null; //클라이언트와 input통신을 할수있는 스트림(IO)
DataInputStream dis = null; //최종적으로 클라이언트와 통신
OutputStream os = null; //클라이언트와 output통신을 할수있는 스트림(IO)
DataOutputStream dos = null; //최종적으로 클라이언트와 통신
try {
ServerSocket server = new ServerSocket(12345);
System.out.println("ServerSocket준비완료..클라이언트의 접속을 기다림");
// 대기하다가 (Listen) 클라이언트 접속하면 클라이언트정보를 Socket객체로 만들어서 리턴
while (true) {
client = server.accept();
//클라이언트가 전송하는 데이터를 읽기위한 스트림객체를 Socket으로부터 생성
is = client.getInputStream();
dis = new DataInputStream(is);
//클라이언트로 전송할 데이터를 출력하기위한 스트림객체를 Socket으로부터 생성
os = client.getOutputStream();
dos = new DataOutputStream(os);
//여기까지가 준비 작업
// 1. server => client
//순서가 중요 - thread돌리는게 아니라서 output 2번하면 client에서도 똑같이 input 2번
dos.writeUTF(client.getInetAddress().getHostAddress()+"님 접속을 환연합니다.");
dos.writeInt(20000);
// 2. server <= client
String clientMsg = dis.readUTF();
System.out.println("클라이언트가 전송한 데이터 : "+clientMsg);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
파일명 : MyNetClient02.java
package networktest;
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 MyNetClient02 {
public static void main(String[] args) {
//서버와 통신할 수 있는 Socket만들고 서버접속
Socket server = null;
InputStream is = null; //서버와 input통신을 할수있는 스트림(IO)
DataInputStream dis = null; //최종적으로 서버와 통신
OutputStream os = null; //서버와 output통신을 할수있는 스트림(IO)
DataOutputStream dos = null; //최종적으로 서버와 통신
try {
server = new Socket("192.168.35.61",12345); //cmd에서 ipconfig찍으면 나오는 내IP
//서버가 전송하는 데이터를 읽기위한 스트림객체를 Socket으로부터 생성
is = server.getInputStream();
dis = new DataInputStream(is);
//서버로 전송할 데이터를 출력하기위한 스트림객체를 Socket으로부터 생성
os = server.getOutputStream();
dos = new DataOutputStream(os);
//여기까지가 준비 작업
// 1.client <= server 서버가 전송한 데이터 읽기
//순서가 중요 - thread돌리는게 아니라서 output 2번하면 client에서도 똑같이 input 2번
String UTFMsg = dis.readUTF();
System.out.println("서버가 전송한 데이터 1: "+UTFMsg);
int intMsg = dis.readInt();
System.out.println("서버가 전송한 데이터 2: "+intMsg);
// 2. client => server 클라이언트에서 서버로 전송
dos.writeUTF("안녕하세요 서버님 클라이언트입니다.");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
728x90
'Programming > Java' 카테고리의 다른 글
Java / 캡슐화 / 상속 / 다형성 개념 (0) | 2021.03.26 |
---|---|
Java / 결제 시스템 연습 / extends와 implements 차이 (0) | 2021.03.25 |
Java 기본 제공 API / 패키지 / String / Random 클래스 / 개념 (0) | 2021.03.20 |
Java언어란? / 개념 정리 (0) | 2021.03.13 |
Java / OOP 객체 지향/ BufferedReader / try ~ catch (0) | 2021.03.13 |
댓글