URLConnection
등은 내부적으로 소켓 사용java.net
패키지의 클래스들 사용Socket
, ServerSocket
사용☕ TCPServer.java
public class TCPServer {
// 💡 내 컴퓨터를 의미하는 IP주소
// - 일반적으로 localhost로 매핑
public static final String SERVER_IP = "127.0.0.1";
// IP가 아파트 주소라면 포트는 게이트 번호
public static final int PORT_NO = 1234;
public static void main(String[] args) {
try (
// 💡 ServerSocket
// - 클라이언트(들)로부터 요청을 받기 위한 소켓
// - 연결을 받아 Socket 인스턴스 반환
ServerSocket serverSkt = new ServerSocket(PORT_NO)
) {
while (true) {
try (
// 💡 Socket : 클라이언트로부터 요청이 오면 반환되는 소켓
Socket clientSkt = serverSkt.accept();
// 💡 클라이언트로부터 받을 스트림
InputStream is = clientSkt.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringWriter sw = new StringWriter();
PrintWriter piw = new PrintWriter(sw);
// 💡 클라이언트에게 보낼 스트림
OutputStream os = clientSkt.getOutputStream();
// 💡 두 번째 인자 : autoflush
// - 값이 프린트 될 때마다 바로 스트림으로 출력할지 여부
PrintWriter pow = new PrintWriter(os, true);
) {
String line;
int lineCount = 1;
while ((line = br.readLine()) != null) {
piw.printf(
"%3d : %s%n".formatted(
lineCount++, line
)
);
// 💡 클라이언트에게 되돌려보낼 메시지
pow.printf("✅ 수신: %s... 등 %d자%n".formatted(
line.substring(
0, Math.min(3, line.length())
), line.length()
));
}
System.out.println(sw);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
☕ TCPClient.java
public class TCPClient {
public static String lyric = "" +
"검푸른 파도속으로 눈물을 묻었지\\n" +
"바위산 계곡을 따라 외로움 잊었지\\n" +
"강한것은 아름다워 타오르는 태양처럼\\n" +
"강한것은 아름다워 변함없는 바위처럼\\n" +
"불타는 노을 보면서 고개를 들었지\\n" +
"눈물의 세월 모두다 저 멀리 던졌지\\n" +
"강한것은 아름다워 타오르는 태양처럼\\n" +
"강한것은 아름다워 변함없는 바위처럼\\n" +
"외인구단 외인구단 태양 이어라\\n" +
"외인구단 외인구단 바위 되어라";
public static void main(String[] args) {
try (
// 💡 서버 연결에 사용할 소켓
Socket socket = new Socket(SERVER_IP, PORT_NO);
// 💡 서버로 보낼 스트림
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os, true); // ⭐️ autoflush
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
) {
for (String line : lyric.split("\\n")) {
pw.println(line);
System.out.println(br.readLine());
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}