ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바기초] GUI 네트워크 통신 (TCP방식, UDP방식) 정리노트
    º Language º/Java 2023. 4. 13. 23:33

    * 네트워크 프로그램이란?

     

    - 서로 떨어져 있는 컴퓨터들끼리 데이터를 주고 받기 위한 프로그래밍을 말합니다.

    - java.net :  네트워크 관련 클래스를 모아 둔 패키지 

     

     

    * ip address 란?

     

    - 네트워크 상의 특정 컴퓨터를 구별하기 위한 식별자를 말합니다.

    - 내 컴퓨터의 ip 주소 확인 방법 : cmd 창에서 c:\> ipconfig 

     

     

    * port 번호란?

     

    - 하나의 컴퓨터에서 동시에 여러 개의 네트워크 프로그램이 동작할 때 특정 프로그램을 구별하기 위한 식별자입니다.

     

     

    * Server 와 Client 란?

     

    - Server : 네트워크 상에서 서비스를 제공하는 컴퓨터 혹은 프로그램

    - Client : 서비스를 제공받은 컴퓨터 혹은 프로그램

     

     

    * InetAddress 란?

     

    - 인터넷 주소와 관련한 정보를 제공하는 클래스 입니다.

     

     

    * URL (Uniform Resource Locator) 이란?

     

    - 인터넷 상의 특정 문서의 정보를 위한 클래스 입니다.

     

     

    * 네트워크 통신(데이터 주고받기) 방식 (2가지)

     

    1. TCP 방식 

    - 일상 생활의 전화와 유사하며, 서로 연결을 맺은 후 연결된 회선으로 데이터를 주고 받는 형식입니다.

    - 신뢰성이 보장되나, 네트워크의 부담이 늘어납니다.

    - ServerSocket, Socket 클래스를 사용합니다.

     

    2. UDP방식

    - 일상 생활의 편지와 유사하며, 연결을 먼저 맺지 않고 데이터와 함께 목적지의 주소까지 포함된 패킷단위로 데이터를 주고 받는 형식입니다.

    - 신뢰성이 보장되지 않지만, 네트워크의 부담이 줄어듭니다.

    - DatagramSocket, DatagramPacket 클래스를 사용합니다.

     

     

    1) TCP 방식의 통신 하기

     

                          Server                                                                                      Client
    ==============================================================================
    1. ServerSocket 객체 생성한다.
    2. 클라이언트의 접속을 무한 대기한다.
                                                                                                   3.  Socket객체를 생성하여 서버에 통신을 요청한다.
    4. accept가 동작하여 통신을 수락한다.
       (클라이언트와 통신할 Socket를 반환)
       
    5. 데이터를 주고 받을 스트림 생성한다.                            5.  데이터를 주고 받을 스트림 생성한다.  
    6. 데이터를 주고 받는다.                                                       6. 데이터 주고 받는다.
    7. 스트림을 닫아 준다.                                                           7. 스트림을 닫아 준다.
    8. 소켓을 닫아 준다.                                                               8. 소켓을 닫아 준다.

     

     

    코드예시

    public class TCPServerEcho {
    	public static void main(String[] args) {
    		try {
    			ServerSocket server = new ServerSocket(9003);
    			byte []data = new byte[100];
    			while(true) {
    				Socket socket = server.accept();
    				System.out.println("*** 클라이언트가 접속하였습니다. ***");
    				InputStream is = socket.getInputStream();
    				OutputStream os = socket.getOutputStream();
    				while(true) {
    					is.read(data);
    					os.write(data);//메아리!!					
    					String msg = new String(data);
    					System.out.println("수신된 데이터:"+msg);
    					Arrays.fill(data, (byte)0);
    				}
    			}
    		}catch (Exception e) {
    			System.out.println("예외발생:"+e.getMessage());
    		}
    	}
    }

    > Server의 클래스 입니다.

     

     

    public class TCPClientEcho extends JFrame {
    	JTextField jtf;
    	JTextArea jta;
    	InputStream is;
    	OutputStream os;
    	
    	public TCPClientEcho() {
    		
    		
    		jtf = new JTextField();
    		jta = new JTextArea();
    		JScrollPane jsp = new JScrollPane(jta);
    		JPanel p  = new JPanel();
    		p.setLayout(new BorderLayout());
    		JButton btn_send = new JButton("전송");
    		p.setLayout(new BorderLayout());
    		p.add(jtf, BorderLayout.CENTER);
    		p.add(btn_send, BorderLayout.EAST);
    		add(jsp, BorderLayout.CENTER);
    		add(p, BorderLayout.SOUTH);
    		
    		try {
    			socket = new Socket("localhost",9003);
    			jta.append("*** 서버에 연결하였습니다.***\n");
    			is = socket.getInputStream();
    			os = socket.getOutputStream();			
    		}catch (Exception e) {
    			System.out.println("예외발생:"+e.getMessage());
    		}
    		
    		setSize(400, 300);
    		setVisible(true);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		btn_send.addActionListener(new ActionListener() {			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				String msg = jtf.getText();
    				byte []data = msg.getBytes();
    				try {
    					os.write(data);
    				}catch (Exception ex) {
    					System.out.println("예외발생:"+ex.getMessage());
    				}
    			}
    		});
    		
    		//서버로 부터 수신되는 데이터를 받기 위한 쓰레드 클래스를 만들어요
    		class ClientThread extends Thread{
    			byte []data = new byte[100];
    			public void run() {
    				while(true) {
    					try {
    						is.read(data);
    						String msg = new String(data);
    						jta.append(msg+"\n");
    						Arrays.fill(data, (byte)0);
    					}catch (Exception e) {
    						System.out.println("예외발생:"+e.getMessage());
    					}
    				}
    			}
    		}
    		
    		new ClientThread().start();
    		
    	}
    	public static void main(String[] args) {
    		new TCPClientEcho();
    	}
    }	Socket socket;

    > Client의 클래스입니다.

     

     

     

    2) UDP 방식의 통신 하기

     

                            수신자                                                                                     발신자
    ==============================================================================
    1. DatagramSocket 객체를 생성한다.
    2. 데이터를 받을 DatagramPacket을 생성한다.
    3. 데이터가 오기를 무한 반복하여 기다린다.
                                                                                          4.  데이터를 보내기 위한 DatagramPacket을 생성한다.
                                                                                          5. DatagramSocket을 이용하여 데이터를 보낸다.
    6. DatagramSocket을 이용하여 데이터를 받는다.

     

     

     

    코드예시

     

    public class UDPSenderGUI extends JFrame {
    	
    	JTextArea jta;
    	JTextField jtf;
    	InetAddress addr;
    	int port;
    	DatagramSocket socket;
    	
    	public UDPSenderGUI() {
    		try {
    			socket = new DatagramSocket();
    			addr= InetAddress.getByName("localhost");
    			port = 9002;
    		}catch (Exception e) {
    			System.out.println("예외발생:"+e.getMessage());
    		}
    		
    		jta = new JTextArea();
    		jtf = new JTextField();
    		JScrollPane jsp = new JScrollPane(jta);
    		JPanel p = new JPanel();
    		p.setLayout(new BorderLayout());
    		JButton btn_send = new JButton("전송");
    		p.add(jtf, BorderLayout.CENTER);
    		p.add(btn_send, BorderLayout.EAST);
    		
    		add(jsp, BorderLayout.CENTER);
    		add(p, BorderLayout.SOUTH);
    		
    		setSize(400, 300);
    		setVisible(true);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
    		
    		class ClientThread extends Thread{
    			byte []data = new byte[100];
    			DatagramPacket packet = new DatagramPacket(data, data.length);
    			public void run() {
    				while(true) {
    					try {
    						socket.receive(packet);
    						String msg = new String(data);
    						jta.append(msg+"\n");						
    					}catch (Exception e) {
    						System.out.println("예외발생:"+e.getMessage());
    					}
    				}//end while
    			}// end run
    		}// end inner class
    		
    		new ClientThread().start();
    		
    		btn_send.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				String msg = jtf.getText();
    				byte []data = msg.getBytes();
    				DatagramPacket packet
    				= new DatagramPacket(data, data.length, addr, port);
    				try {
    					socket.send(packet);
    				}catch (Exception ex) {
    					System.out.println("예외발생:"+ex.getMessage());
    				}
    			}
    		});
    	}
    	public static void main(String[] args) {
    		new UDPSenderGUI();
    	}
    }

    > Sender 발신자의 클래스입니다.

     

    public class UDPReceiver_echo {
    	public static void main(String[] args) {
    		try {
    			DatagramSocket socket = new DatagramSocket(9002);
    			byte []data = new byte[100];
    			DatagramPacket packet = new DatagramPacket(data, data.length);
    			while(true) {
    				socket.receive(packet);
    				//데이터를 받았을때 보낸측의 주소정보도 함께옵니다.
    				
    				socket.send(packet);
    				//수신한 데이터를 그대로 보냅니다. ==> 메아리
    				
    				String msg = new String(data);
    				System.out.println("수신된 데이터:"+msg);
    				
    				Arrays.fill(data, (byte)0);
    			}
    		}catch (Exception e) {
    			System.out.println("예외발생:"+e.getMessage());
    		}
    	}
    }

    > Receiver 수신자의 클래스입니다.

Coder yein