소켓( 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 |