Search
Duplicate
📒

[Java Study] 14-x. 소켓 프로그래밍

상태
수정중
수업
Java Study
주제
연관 노트
3 more properties
참고

Socket 클래스

NOTE
네트워크를 통해 TCP/IP 통신을 연결시켜주는 객체!
자바에서 TCP(Transmission Control Protocol) 통신을 한다면 제공하는 API를 사용
java.net 패지키에서 클래스들을 사용할 수 있다.
데이터를 받는 쪽(서버)에서 클라이언트 요청을 받으면, 요청에 대한 Socket 객체를 생성하여 처리한다.

통신과정

1.
서버 프로그램에서 ServerSocket을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결요청 처리 준비
2.
클라이언트의 프로그램은 접속할 서버의 ip, port를 가지고, 연결을 요청
3.
ServerSocket은 클라이언트의 연결요청을 받으면 새로운 Socket을 생성해서 클라이언트의 Socket과 연결되도록함
4.
클라이언트의 Sokcet과 새로 생성된 서버의 Socket은 ServerSocket과 관계없이 1대1 통신을 한다

참고

ServerSocket은 포트와 결합되어, 연결요청이 올 때마다 새로운 Socket을 생성해서 연결해준다.
여러 개의 소켓이 하나의 포트를 공유해서 사용할 수 있으나, ServerSocket은 포트를 독점한다!

ServerSocket 생성자(데이터 받음)

NOTE
포트와 연결(bind)되어 외부의 연결요청을 기다리다 요청이 들어오면, Socket을 생성해서 소켓과 소켓의 통신이 이루어지게 해준다!
생성자
설명
ServerSocket()
서버 소켓 객체만 생성한다.
ServerSocket(int port)
지정된 포트를 사용하는 서버 소켓을 생성한다.
ServerSocket(int port, int backlog)
지정된 포트와 backlog 개수를 가지는 소켓을 생성한다.
ServerSocket(int port, int backlog, InetAddress bindAddr)
지정된 포트와 backlog 개수를 가지는 소켓을 생성하여, bindAddr에 있는 주소에서의 접근만을 허용한다.
클라이언트가 연결해 올 때마다 요청은 요청큐(Request Queue)에 쌓인다.
각각의 클라이언트 연결에 대해 accept를 함으로써 요청을 요청큐에서 꺼내고, Socket객체가 리턴된다!
backlog
쉽게 생각하면 큐의 개수라고 생각하면 된다.
ServerSocket 객체가 바빠서 연결 요청을 처리 못하고 대기시킬 떄가 있는데, 그 때의 최대 대기 개수라고 생각하면 된다. (기본 50개)
접속이 원활하지 않는다면, 이 개수를 적절하게 증가시키는 것이 좋다.
InetAddress 클래스의 객체 bindAddr
특정 주소에서만 접근이 가능하도록 지정할 때 사용한다.

연결작업 메소드

리턴 타입
메소드
설명
Socket
accept()
새로운 소켓 연결을 기다리고, 연결이 되면 Socket 객체를 리턴
void
close()
소켓 연결을 종료
accept()는 객체 생성후 사용자의 요청을 대기하는 메소드
close()는 메소드 처리를 하지 않고, JVM이 계속 동작하고 있다면, 해당 포트는 동작하는 서버나 PC에서 다른 프로그램이 사용할 수 S없다.

Socket 생성자(데이터 보냄)

NOTE
프로세스간의 통신을 담당, InputStreamOutputStream을 가지고 있다. 이 두 스트림을 통해 프로세스간 통신(입출력)이 이루어진다!
생성자
설명
Socket()
소켓 객체만 생성
Socket(Proxy proxy)
프록시 관련 설정과 함께 소켓 객체만 생성
Socket(SocketImpl impl)
사용자가 지정한 SocketImpl 객체를 사용하여 소켓 객체만 생성
Socket(InetAddress address, int port)
소켓 객체 생성 후 address와 port를 사용하는 서버에 연결
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
소켓 객체 생성 후 address와 port를 사용하는 서버에 연결하며, 지정된 localAddr와 localPort에 접속
Socket(String host, int port)
소켓 객체 생성 후 host와 port를 사용하는 서버에 연결
Socket(String host, int port, InetAddress localAddr, int localPort)
소켓 객체 생성 후 host와 port를 사용하는 서버에 연결하며, 지정된 localAddr과 localPort에 접속
hostport를 지정하는 생성자를 사용하는 것이 가장 편하다.
Sokcet 클래스ServerSocket 클래스와 마찬가지로 close() 메소드를 사용하여 소켓을 닫는다.
Socket socket = null; try { // 127.0.0.1(localhost)에서 서버에 대한 연결 설정, 포트번호 9000 socket = new Socket("127.0.0.1", 9000); // OutStream은 서버에 데이터를 보내는데 사용된다. OutputStream outputStream = socket.getOutputStream(); // data를 String으로 변환 -> getBytes()를 사용하여 문자열의 바이트 꺼내고 OutputStream에 기록 outputStream.write(Integer.toString(data).getBytes()); // flush -> 데이터 전송시킴 outputStream.flush(); // 소켓에 대한 연결을 끊는다. socket.close(); } catch (IOException e) { System.err.println("Failed to send data to server: " + e.getMessage()); } finally { if(socket != null){ try{ socket.close(); }catch (Exception e){ e.printStackTrace(); } } }
Java
복사
데이터 전송코드