Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions src/step06_network/req_execution_threadpool/EchoSercer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package step06_network.req_execution_threadpool;

import javax.xml.crypto.Data;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.reflect.Executable;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class EchoSercer {
private static ServerSocket serverSocket = null;
//10개의 스레드로 요청을 처리하는 스레드풀 생성
private static ExecutorService executorService =
Executors.newFixedThreadPool(10);

public static void main(String[] args) {
System.out.println("------------------------------------------");
System.out.println("서버를 종료하려면 q를 입력하고 Enter키를 입력하세요.");
System.out.println("------------------------------------------");

//TCP 서버 시작
startServer();

//키보드 입력
Scanner sc = new Scanner(System.in);
while(true){
String key = sc.nextLine();
if(key.toLowerCase().equals("q")){
break;
}
}
sc.close();

//TCP 서버 종료
stopServer();
}

public static void startServer(){
//작업 스레드 정의
Thread thread = new Thread(){
@Override
public void run(){
try{
//serverSocket 생성, Port 바인딩
serverSocket = new ServerSocket(50001);
System.out.println("[서버] 시작됨\n");

//연결 수락 및 데이터 통신
while (true){
//연결 수락
Socket socket = serverSocket.accept();
/**
* 작업 큐에 처리 작업 넣기
* RUnnable은 함수형 인터페이스라 람다식으로 표현
*/
executorService.execute(() -> {
try{
//연결된 클라이언트 정보 얻기
InetSocketAddress isa =
(InetSocketAddress) socket.getRemoteSocketAddress();
System.out.println("[서버] "+isa.getHostName()+"의 연결 요청 수락");

//데이터 받기
DataInputStream dis = new DataInputStream(
socket.getInputStream());
String message = dis.readUTF();

//데이터 보내기
DataOutputStream dos =
new DataOutputStream(socket.getOutputStream());
dos.writeUTF(message);
dos.flush();
System.out.println("[서버] 받은 데이터를 다시 보냄 "+message);

//연결 끊기
socket.close();
System.out.println("[서버] "+isa.getHostName()+"의 연결을 끊음\n");
}catch (IOException e){
}
});
}
}catch (IOException e){
}
}
};
//스레드 시작
thread.start();
}

public static void stopServer(){
try{
//ServerSocket을 닫고 Port 언 바인딩
serverSocket.close();
executorService.shutdownNow(); //스레드풀 종료
System.out.println("[서버] 종료됨 ");
}catch (IOException e){
}
}
}