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);
}
'모바일 > Android_Java' 카테고리의 다른 글
AsyncTask vs Thread vs Service 차이 (0) | 2020.12.04 |
---|---|
Non-blocking I/O(NIO) (0) | 2020.11.20 |
NavigationView onNavigationItemSelected not Working, 반응 없음 현상 (0) | 2020.11.15 |
MAC OSX에서 터미널 adb 사용하기 (0) | 2020.11.11 |
AppBarLayout, ToolBar, CollapsingToolBar 정리 (0) | 2020.11.11 |