네트워크 상에서
프로세스간 통신:IPC
소켓( Sockets ) OS - 소켓
。네트워크상에서 연결된 두 컴퓨터의프로세스간IPC를 위한Endpoint
▶IPC를 수행할네트워크상컴퓨터의프로세스는소켓번호로 식별
。Client Socket과Server Socket으로 구분되어소켓을 연결하여 두프로세스간 네트워크 통신을 가능하게함.
。프로토콜 계층상에서어플리케이션 계층의프로세스와트랜스포트 계층의프로토콜간Message를 전달하는Interface역할을 수행
。프로토콜 계층中어플리케이션 계층에서어플리케이션에서 생성한Message를 다른Host의어플리케이션으로 전달하기위해소켓을 통해트랜스포트 계층으로Message를 송수신
▶어플리케이션 계층의프로세스는 개발자에 의해 제어되고, 그 이하계층의프로세스OS에 의해 제어됨
- 네트워크 상
소켓식별
。네트워크 통신을 수행할 각프로세스는 하나의소켓을 가진다.
▶소켓을 생성하는 경우Port Number가 식별자로서 각각의소켓에 할당됨
。Socket=IP Address+Port
▶32bit의IP Address번호와 각Host의프로세스를 연결하는파이프용도의Port의 번호를 조합하여네트워크로 연결된Host를 식별 후IPC를 수행
ex)www.google.com:8080의 경우도메인 주소로 변환한IP Addrss의서버컴퓨터에서Port를 통해 데이터를 요청
UDP소켓 프로그래밍 흐름
。UDP Server Socket은 상시 실행
。UDP Client Socket은 송수신하는 동안 실행
1.UDP Server Socket및UDP Client Socket생성
。Server Socket생성 시포트번호는 개발자에 의해 명시적으로 지정
2.Segment와 함께Server Host의IP Address와Server Socket의포트번호를 포함하여Datagram을 생성 후UDP Client Socket을 통해 전송
▶Datagram송신 시Client Host의IP주소와Client Socket의포트번호가 자동으로 포함
3.UDP Server Socket에서 해당Datagram을 수신 및Client의IP 주소와포트번호를 추출
4. 작업 후Server Socket을 통해Client IP주소와포트번호를 포함하여Datagram생성 후 해당하는Client Socket으로 응답
5.ClientSocket에서ServerSocket으로부터Datagram수신 및ClientSocket종료
JAVA-UDP 소켓 구현
UDP Client Socket
。Class의 생성자로Logic을 구현 후main 메서드에서 객체를 생성하여UDP Client의 송수신을 실행import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPClient { private String str; private BufferedReader file; private static int SERVERPORT = 12000; public UDPClient(String hostname,int port) { try{ InetAddress ia = InetAddress.getByName(hostname); DatagramSocket ds = new DatagramSocket(port); file = new BufferedReader(new InputStreamReader(System.in)); str = file.readLine(); byte buffer[] = str.getBytes(); DatagramPacket dp = new DatagramPacket( buffer, buffer.length, ia, SERVERPORT); ds.send(dp); buffer = new byte[1024]; dp = new DatagramPacket(buffer, buffer.length); ds.receive(dp); System.out.println("server ip : "+dp.getAddress() + " , server port : "+dp.getPort()); System.out.println("수신된 데이터 : "+ new String(dp.getData()).trim()); }catch(IOException ioe){ ioe.printStackTrace(); } } public static void main(String[] args) throws Exception { new UDPClient("localhost",2000); } }。
Server Host의IP Address와ServerSocket의Port번호 : 12000와 송신할 데이터를 통해DatagramPacket( =Datagram역할 )생성
▶Server Host의IP Address는Hostname를IP Address로DNS하는InetAddress에 의해 도출
。UDP는TCP와 달리비연결성 프로토콜이므로 데이터에 목적지 소켓의IP Address와포트번호를 추가해야하므로DatagramPacket을 통해Datagram을 구현
。이후포트번호 : 2000의Client Socket에 의해DatagramPacket을네트워크로 전송
UDP Server Socket
。Class의 생성자로Logic을 구현 후main 메서드에서 객체를 생성하여UDP Server Socket의 송수신을 실행import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPServer { public UDPServer(int port){ try { DatagramSocket ds = new DatagramSocket(port); while (true) { byte buffer[] = new byte[512]; DatagramPacket dp = new DatagramPacket(buffer,buffer.length); System.out.println("ready"); ds.receive(dp); String str = new String(dp.getData()); System.out.println("수신된 데이터 : " + str); InetAddress ia = dp.getAddress(); port = dp.getPort(); System.out.println("client ip : " + ia + " , client port : " + port); dp = new DatagramPacket(dp.getData(),dp.getData().length, ia,port); ds.send(dp); } } catch (IOException ioe) { ioe.printStackTrace(); } } public static void main(String[] args) throws Exception { new UDPServer(12000); } }。
DatagramSocket에 의해UDP Client Socket에 의해 전송된DatagramPacket을 수신 시 해당DatagramPacket에 포함된Client Host의IP Address와Client Socket 포트번호를 추출 후 응답.
TCP소켓 프로그래밍 흐름
。TCP Server Socket은 상시 실행
。TCP Client Socket은TCP Connection연결 및 송수신 후 연결종료
1.TCP Server Socket생성 및TCP Client Socket으로부터의TCP Connection요청을 대기
。Server Socket생성 시포트번호는 개발자에 의해 명시적으로 지정
2.TCP Client Socket생성 및TCP Connection수행
3.TCP Connection이 된 경우TCP Client Socket을 통해TCP Server Socket으로 Request 전송
4.TCP Server Socket에서Request수신 후 응답하여TCP Client Socket로 전송 및 해당TCP Connection종료 및 연결재대기
5. 응답을 수신한 경우TCP Client Socket종료
JAVA - TCP 소켓 구현
。Socket클래스와ServerSocket클래스의 객체를 생성하여Server Socket과Client Socket로서 활용
- Server Socket
。Server-Side로서TCP 서버역할을 수행할 특정포트번호로 바인딩된ServerSocket Class의 객체 생성
▶서버소켓객체는 바인딩된포트번호로Client Socket부터의 연결요청을 상시대기
。Client Socket로부터 연결이 된 경우서버소켓객체.accept()를 통해Client Socket의Socket 객체를 반환
▶Client Socket의Socket Class객체가 반환된 경우 두프로세스간 연결이 정상적으로 되었으며 반환된Socket 객체를 통해 통신을 수행
。통신이 전부 수행된 경우서버소켓객체.close()를 통해프로세스간 연결종료import java.io.*; import java.net.*; public class DateServer { public static void main(String[] args) throws Exception { // 포트 8080의 TCP 서버소켓 생성 ServerSocket server = new ServerSocket(8080); while ( true ){ // 포트:8080으로 Client Socket으로부터의 연결요청 대기 System.out.println("연결대기중"); // 연결요청 수신 및 Client Socket의 Socket 객체 반환 Socket client = server.accept(); PrintWriter pout = new PrintWriter(client.getOutputStream(),true); System.out.println("새로운 클라이언트 소켓 연결됨"); pout.println(new java.util.Date().toString()); // 소켓 종료 및 연결요청 재대기 client.close(); } } }.
- Client Socket
。연결을 수행할 특정ServerSocket의 컴퓨터의IP주소,포트번호를 생성자로 전달하여 연결될Client Socket역할의Socket 객체를 생성
▶ 해당Socket 객체를 통해 데이터의 송수신을 수행import java.io.*; import java.net.*; public class DateClient { public static void main(String[] args) throws Exception { Socket socket = new Socket("127.0.0.1", 8080); InputStream in = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line = null; // 소켓으로부터 Date 를 Read while ((line = br.readLine()) != null ) System.out.println(line); // 소켓 연결 종료 socket.close(); } }