Programming Language/Java

[Java] java.net.BindException: Address already in use

LeeJaeJun 2024. 6. 17. 22:28
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 :(포트번호)

lsof -i :8080

# 프로세스 종료
kill -9 <PID>
# <PID>에는 위에서 확인한 PID를 적는다
# 참고로 -9은 강제 종료 시그널(SIGKILL)이다.

필자가 확인한 PID는 2792

다시 프로그램을 시작하니 정상적으로 보인다. 필자의 코드의 경우 어떠한 출력을 하고 있지않아서 제대로 동작하는 줄 모르고 이미 실행이 됐는데 또 실행을 하려고 해서 이미 사용된 포트라고 뜬 것이었다. 디버그 모드로 확인해본 결과 서버는 정상 작동 중 이었다!

HTTP 요청을 잘 수집 중이었다..

728x90
반응형