Daily coding

Java Basic : day 16 - 서버 / 클라이언트 연결하기 본문

Language/Java_basic

Java Basic : day 16 - 서버 / 클라이언트 연결하기

sunnnkim 2019. 12. 9. 18:54

Server 클래스 

package day16.Lecture01_tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client_mainClass {
	
	// Client 코드
	
	public static void main(String[] args)  {
		// TODO Auto-generated method stub
		
		/*
	 	1. 접속을 해야할 Server Ip(주소)를 설정 - Socket
	 	2. Socket 생성
	 	3. 접속 connect 
	 	4. 통신
	 
	 */
	
    
		// InetSocketAddress 클래스
		// 접속하고자하는 서버(서버소켓)의 IP주소와 포트 넘버를 설정하여 반환하는 객체
		InetSocketAddress sockAddr = new InetSocketAddress("192.168.2.31", 9000 ); 
                                                             // (IP주소, 포트넘버)
		Socket socket = new Socket(); // 단 한개인 클라이언트 소켓 (껍데기인 상태)
		
        
        
		// Server 접속
        // 예외처리 필수
		try {
        
        
			// connect 메소드에 연결 
            // 소켓 껍데기에 서버소켓과의 연결정보를 설정하고 연결을 요청한다.
             
			socket.connect(sockAddr, 10000 ); 
			// (문지기 소켓 객체, 만분의1초(현재는 10초임))
			
			
			// InetAddress : 자바에서 IP 주소를 표현할때 사용하는 클래스
			InetAddress inetAddr;
            
			if((inetAddr = socket.getInetAddress())!= null) {
			    System.out.println("서버연결 성공 : " + inetAddr);
			}else {
				System.out.println("서버 연결 실패");
			}
			
            
			// 전송할 데이터 만들기
            
			Scanner sc = new Scanner(System.in);
			
			while(true) {
				// 보낼 문자열 입력하기 (while로 계속 대화하도록 만듦)
              System.out.print(">> ");
              String str = sc.next();


              // TCP는 stream, UDP는 Datagram 타입을 지정
              // 클라이언트는 먼저 데이터를 보내고, 서버로부터 받기 때문에 
              // send부터 작성한다.
              
              // 1. send
              PrintWriter writer = new PrintWriter(socket.getOutputStream());
              // getOutputStream --> 내보낼 데이터
              
              writer.println(str);	// 실질적으로 전송이 되는 문자열
              writer.flush(); 		// 끝맺음


              // 2. receive : 받기
              BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
              str = reader.readLine();
              System.out.println("서버로부터 받은 메세지 : " + str);


			
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	
	
		

	}

}
​

 

 

 

Client 클래스

package day16.Lecture01_tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server_mainClass {
public static void main(String[] args) throws IOException {

	

	
	// 서버 
	
	// 문지기소켓 : 서버 소켓
	// 포트넘버 9000을 지키고 있는 문지기소켓 serSocket
	ServerSocket serSocket = new ServerSocket(9000);
	// 서버 포트 : 9000
	// 자동으로 현재 PC의 자신의 IP를 설정한다, binding, listen이 포함되어있다
	// 통신순서 1~3이 끝남
	
	System.out.println("접속대기중...");
	
    
    // Client Socket, 담당자 소켓 , 접속하는 클라이언트의 정보를 받아서 가지고 있음
	// 담당자 소켓 당 하나의 클라이언트의 정보(IP주소와 데이터 등)을 가지고 있다.
	// 클라이언트가 들어날 수록 담당자 소켓은 늘어나게 됨 
	Socket clientSocket = null;
	
    
	clientSocket = serSocket.accept();	// serSocket에는 IP/port number를 내포하고 있음
	
	// 클라이언트와 연결이 되면 밑으로 넘어간다.
	
    
    
	// 확인 작업
	// getInetAddress() : 클라이언트의 아이피주소 가져오기
	// getPort() : 클라이언트의 포트 넘버 가져오기
	System.out.println("client IP : " + clientSocket.getInetAddress()
				+ " Port: " + clientSocket.getPort());
	
    
	// 실행 중에 끄지 않고 다시 누르면 binding exception발생 
	// (이미 포트번호 9000번지에는 서버소켓이 사용중이고 실행을 끄지 않고 다시 접속하면 이미 접속중이기 때문에 바인딩에러 발생)
	
	
	
	while(true) { // while문을 사용하면 클라이언트와 계속 대화 할 수 있음
		
        
        
	// 1. receive 
	// 담당자소켓이 데이터를 받는다
	BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
	
    // getInputStream --> 클라이언트로부터 받아온 데이터(문자열)
	String str = reader.readLine();
	System.out.println("서버로부터 받은 메세지 : " + str);
	
	
	
	// 2. send
	
	Scanner sc = new Scanner(System.in);
	System.out.print(">> ");
	str = sc.next();
	
    
	PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
	// getOutputStream --> 내보낼 데이터
    
	writer.println(str);	// 실질적으로 전송이 되는 문자열
	writer.flush(); 		// 끝맺음, 반드시 해줘야함
	
    
	}
	
	// 소켓 해방
//	clientSocket.close();
//	serSocket.close();
	
    
	
	// 위의 코드는
	// 다른 클라이언트와 같이 대화를 할 수 없음
	
	
	}
}