today_is
[ socket ] ip 주소를 통해 간단한 메시지 주고받기 본문
오늘의 목표 >>
java.net.Socket 을 이용하여 간단하게 대상 서버에 대한 메시지를 받아본다.
socket으로 메시지를 주고받을때 무엇이 필요한지 가볍게 알아보자!
step 1 > server 클래스 작성
client 가 접속하면, 보내고싶은 메시지를 내보낸다.
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Server {
public static void main(String[] args) throws Exception {
// 내 컴퓨터가 서버 역할을 할 수 있도록 지정한 포트(1234)를 이용하여 소켓을 개설할 준비를 한다
ServerSocket ss = new ServerSocket(1234);
// 날짜 형식을 이용하여 문자열을 준비한다
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 E요일");
String str = "안녕하세요\n";
str += "오늘은 %s입니다\n";
str += "저는 osl1018 입니다\n";
str = String.format(str, sdf.format(new Date()));
for(int i = 0; i < 5; i++) {
// 서버를 실행하고 다른 프로그램이 접속하기를 기다린다
System.out.println("서버실행. 접속 대기중 ...");
// 대상이 접속하면 가리키는 소켓이 생성됨
Socket so = ss.accept();
// 대상이 접속하면 대상의 아이피 주소를 출력
System.out.printf("%s 접속함\n", so.getInetAddress());
// 대상에게 글자를 내보낼 수 있는 Stream -> writer -> bufferedwriter 를 생성
OutputStreamWriter osw = new OutputStreamWriter(so.getOutputStream(), "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
// 문자열을 보낸다
bw.write(str);
bw.flush();
bw.close();
// 소켓 연결 종료
so.close();
}
// 서버 소켓 연결 종료
ss.close();
}
}
step 2 > client 클래스 작성
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
// 아이피와 포트번호를 지정하여 대상 서버에 접속
Socket so = new Socket("192.168.112.36", 1234);
// 서버에서 전송하는 문자열을 읽을 수 있는 Scanner 를 준비
Scanner sc = new Scanner(so.getInputStream());
// 내용을 받아서 저장하기 위한 문자열 변수
String content = "";
while(sc.hasNextLine()) { // Scanner 에 아직 처리하지 않는 다음 줄이 남아있다면
content += sc.nextLine() + "\r\n"; // 그 내용을 content 에 더한다
}
sc.close(); // 스캐너 연결 종료
so.close(); // 소켓 연결 종료
System.out.println("=================================");
System.out.println(content); // 내용출력
System.out.println("=================================");
}
}
step 3 > 결과
client 클래스에 메시지가 출력된다.
===================================
안녕하세요
오늘은 2023년 11월 17일 금요일 입니다
저는 osl1018 입니다
===================================
study_review >>
정보처리기사 필기를 공부하면서 socket 이라는 용어만 알고 있는 상태였는데
직접 써보니까, 소켓 사용시에 미리 준비되어야할 요소들이 많다는 것을 알게 되었다.
또한, Scanner 사용할때에도 close() 을 까먹곤 했었는데, 지금부터라도 연결을 종료해주는 습관을 들여야겠다.
socket 사용시, 주의할 점 !!
1) 항상 서버 클래스를 먼저 실행해둔다.
클라이언트 클래스의 접속을 받아야하기 때문이다.
2) 항상 메시지를 출력하거나, 내보내고 나서는 close() 를 해주어서 메모리 낭비를 방지하자
'java' 카테고리의 다른 글
[ jsp ] 단순한 도서 관리 (0) | 2023.12.08 |
---|---|
[ jsp ] request 와 response 의 내장객체 (0) | 2023.12.07 |
DAO 와 DTO (template 이용 X) - 2 (0) | 2023.12.05 |
DAO 와 DTO (template 이용) - 1 (0) | 2023.12.03 |
[ exception ] 예외 처리 (0) | 2023.12.03 |