JAVA/정리한 것

[ JAVA ] 소켓 통신

따갓 2022. 5. 21. 00:51

소켓( Socket )

  • 프로토콜, ip주소, 포트넘버로 정의된다.
  • 떨어져 있는 두 호스트를 연결해주는 도구로써 인터페이스 역할을 한다.
  • 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어 진다.
  • 소켓의 역할에 따라 클라이언트 소켓, 서버소켓으로 구분된다.

클라이언트(client)와 서버(server)
서버는 서비스를 제공하고, 클라이언트는 서비스를 사용한다.

IP 주소
컴퓨터(host)를 구별하는데 사용되는 고유한 값으로 인터넷에 연결된 모든 컴퓨터는 IP 주소를 갖는다.

 

[ CASE : 소켓을 활용한 간단한 예제 ]

<  server.java >

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server{
	public static void main( String[] args ) throws IOException{
	
		ServerSocket svr = new ServerSocket( 7890 ); // 포트번호 ( 네트워크 통로의 고유번호 )
		System.out.println("before accept : 접속 대기중");
		
		Socket skt = svr.accept();
        // 클라이언트 올때까지 계속 대기한다. 오게되면 Socket 생성 후 리턴
        
		System.out.println( skt.toString() );  
		
		svr.close();
		skt.close();
	
	}
}
  • ServerSocket svr = new ServerSocket( 7890 ); >> 서버를 생성한다. 7890은 포트번호로, 네트워크 통로의 고유번호라 할 수 있다. 소켓 통신에서 포트는 1~65535 중에 1~1024는 예약되어 있으므로 이 외에서 사용한다.
  • Socket skt = svr.accept(); >> client의 접속을 맞이한다. 클라이언트가 올 때 까지 대기하다가 오게 되면 Socket 생성 후 리턴한다.
  • 마지막엔 생성한 skt 와 svr을 close() 해주어야 한다.

< client.java >

import java.net.Socket;

public class Main1{
	public static void main( String[] args ){
		try{
			Socket skt = new Socket("127.0.0.1" , 7890);
			System.out.println( "go" );
			skt.close();
		}
		catch( Throwable e ){}		
	}
}
  • Socket skt = new Socket("127.0.0.1" , 7890); >> 소켓을 생성하는 순간 ( 클라이언트 서버 주소 : 127.0.0.1 ) 서버에 접속한다. 이 때 매핑 되도록 포트( 7890 )를 똑같이 가져야 한다.
  • 마찬가지로 마지막에 skt.close() 해줘야 한다.

< 결과 >

좌 : 서버 콘솔 / 우 : 클라이언트 콘솔

 

[ CASE : 클라이언트가 서버에게 메세지 전송하기 ] 

< server.java >

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server{
	public static void main( String[] args ){
		try {
			ServerSocket svr = new ServerSocket( 7890 );
			System.out.println(" 클라이언트 대기중 ");
			
			Socket skt = svr.accept();
			System.out.println( skt.getInetAddress() + " 접속 완료 ");
			
			BufferedReader br = new BufferedReader( new InputStreamReader( skt.getInputStream() ));
			String l = "";
			while( ( l = br.readLine() ) != null ) {
				System.out.println( "클라이언트가 보낸 메세지 : " + l );
			}
			br.close();
			System.out.println( "여기까지 대화내용" );
			
			svr.close();
			skt.close();
			
		}
		catch( Exception e ) {
			System.out.println( e.toString() );
		}	
	}
}

 

< client.java >

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Main1{
	public static void main( String[] args ){
		try{
			Socket skt = new Socket("127.0.0.1" , 7890);
			System.out.println( "서버 접속에 성공" );			
			BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
			PrintWriter pw = new PrintWriter( skt.getOutputStream() , true );		
			
			String l = "";
			while( !( l = br.readLine() ).equals("quit") ) {	// quit 입력시 탈출
				pw.println( l );
			}
			
			br.close();
			
			System.out.println( "메세지 전송 완료 ");			
			
			skt.close();
		}
		catch( Throwable e ){}		
	}
}

[ 결과 ] 

위 : 서버 / 아래 : 클라이언트

'JAVA > 정리한 것' 카테고리의 다른 글

[ JAVA ] 예외(Exception) 처리  (0) 2022.05.20
[ JAVA ] 어노테이션( Annotation )  (0) 2022.05.19
[ JAVA ] class.forName()  (0) 2022.05.18
[ JAVA ] 정적( Static )  (0) 2022.05.16
[ JAVA ] 익명 클래스 ( Anonymous Class )  (0) 2022.05.16