Socket 소켓, Data Stream

2020. 11. 17. 09:46모바일/Android_Java

Java Socket

스트림

성능 향상 보조 스트림

  • 메모리 버퍼를 제공하여 프로그램의 실행 성능을 향상시킨다.
  • 직접 하드 디스크에 데이터를 보내지 않고 메모리 버퍼에 데이터를 보낸다(쓰기속도 향상)
  • 버퍼는 데이터가 꽉 차게 되면, 데이터를 한꺼번에 하드 디스크로 보낸다.

바이트 기반(바이트 입력 스트림에 연결) 스트림

BufferedInputStream, OutputStream

문자 기반(문자 입력 스트림에 연결) 스트림

BufferedReader, BufferedWriter
  • 파일읽기
FileInputStream fis = new FileInputStrea("경로");
BufferedInputStrea bis = new BufferedInputStream(fis);
while(bis.read()!=01){}
  • 파일쓰기
FileInputStream fis = new FileInputStream("읽을경로");
bis = new BufferedInputStream(fis);
FileOutputStream fos = new FoleOutputStream("쓰일경로");
bos = new BufferedOutputStream(fos);
while((data = bis.read())!=-1){
    bos.write(data);
}
bos.flush();
//마지막 자투리 데이터 부분이 목적지로 가지 못하고 버퍼에 남아있을 수 있기 때문에 버퍼를 비워준다

기본 타입 입출력 보조 스트림

  • boolean, bytem, char,double,String 등등 사용
  • 데이터 타입의 크기가 모두 다르므로 DataOutputStream으로 출력한 데이터를 다시 DataInputStream으로 읽어올 때는 출력한 순서와 동일한 순서로 읽어야 한다.
FileInputStream fis = new FileInputStream("읽을경로");
DataInputStream dis = new DataInputStream(fis);
dis.readUTF();
dis.readDouble();
...

소켓

Server Socket

ServerSocket serverSocket = null;
try{
    serverSocket = new ServerSocket();
    serverSocket.bind(new InetSocketAddress("","포트번호"));
    //bind메소드는 클라이언트가 연결 요청하기 전까지 블로킹(스레드 대기상태)된다
    //클라이언트가 연결을 요청하면 클라이언트와 통신할 Socket을 만들고 리턴한다.
}
while(true){
    Socket socket = serverSocket.accept(); // 클라이언트 연결 수락
}

ClientSocket

Socket socket = null;
try{
    socket = new Socket();
    socket.connect(new InetSocketAddress("","포트번호"));
}

데이터 통신

  • 서버가 연결을 수락하면 양쪽의 Socket객체로부터 각각 입력 스트림, 출력 스트림을 얻을 수 있다.

    InputStream is = socet.getInputStream();
    bytes = new byte[100];
    int readByteCount = is.read(bytes);
    //데이터 수신 위해 InputStream의 read() 메소드 호출하면 상대방이 데이터를 보내기 전까지는 블로킹된다.

효율성

  • Socket객체를 하나씩 생성하여 스레드를 만드는것은 비용이 많이든다
  • 따라서 스레드풀을 사용하여 스레드 수를 제한한다.
void startServer(){
    excutorService = Excutors.newFixedThreadPool(
        Runtime.getRuntime().availabeProcessors();
    );
    //CPU 코어의 수만큼 스레드를 만든다.
}
List<Client> connections = new Vector<Client>();
Runnable runnable = new Runnable(){
    @Override
    public void run(){
        ...
        while(true){
            Socket socket = serverSocket.accpet();
            ...;

            Client client = new Client(Socket);
            connections.add(client);
        }
    }

    ...;
    edcutorService.submit(runnable);
}