728x90
반응형
HTTP 서버의 기본적인 형태를 구현하여 실행키는데 Exception in thread "main" java.net.BindException: Address already in use 에러가 났다.
package myServer;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
final private static int PORT = 8080;
public static void main(String[] args) throws Exception {
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
while (true) {
try {
Socket client = serverSocket.accept();
handleClient(client);
}
catch(Exception err) {
err.printStackTrace();
}
}
}
}
private static void handleClient(Socket client) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(client.getInputStream())
);
List<String> requestsLines = new ArrayList<>();
String line;
do {
line = br.readLine();
requestsLines.add(line);
}while(!line.isBlank());
}
}
해당 오류는 다음과 같은 상황에서 발생한다.
- 다른 프로그램이 이미 해당 포트를 사용하고 있는 경우
- 이전에 실행된 서버 프로그램이 여전히 포트를 점유하고 있는 경우
사용 중인 포트 확인 및 종료법
Windows의 경우
# 사용중인 포트 확인
netstat -aon | findstr :(포트번호)
# 포트번호에는 현재 자신의 서버가 실행시키고자 하는 포트번호를 적으면 된다.
# 위 코드를 기준으로는 8080을 적으면 된다.
# 프로세스 종료
taskkill /PID <PID> /F
# <PID>에는 netstat의 결과에서 확인한 PID를 적으면 된다.
Mac의 경우
# 사용중인 포트 확인
lsof -i :(포트번호)
# 프로세스 종료
kill -9 <PID>
# <PID>에는 위에서 확인한 PID를 적는다
# 참고로 -9은 강제 종료 시그널(SIGKILL)이다.
다시 프로그램을 시작하니 정상적으로 보인다. 필자의 코드의 경우 어떠한 출력을 하고 있지않아서 제대로 동작하는 줄 모르고 이미 실행이 됐는데 또 실행을 하려고 해서 이미 사용된 포트라고 뜬 것이었다. 디버그 모드로 확인해본 결과 서버는 정상 작동 중 이었다!
728x90
반응형
'Programming Language > Java' 카테고리의 다른 글
[Java] BufferedReader, BufferedWriter (0) | 2024.12.21 |
---|---|
[Java] nextInt()와 nextLine() 혼합 사용 문제 (0) | 2024.12.21 |
[Java][Maven][VSCode] syntax error near unexpected token `('. @REM Licensed to the Apache Software Foundation (ASF) (0) | 2023.12.31 |
[Java] printf에서 %n과 \n의 차이점 (0) | 2023.12.31 |
[Java] VScode javax.swing 실행이 안될 때 (0) | 2023.12.31 |