today_is

[ socket ] ip 주소를 통해 간단한 메시지 주고받기 본문

java

[ socket ] ip 주소를 통해 간단한 메시지 주고받기

ye_rang 2023. 12. 6. 14:32

오늘의 목표 >> 

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