JAVA기초

소켓프로그램 (ip출력해서 서버와 클라이언트 단방향 통신하기)

LRWoo 2023. 6. 27. 21:32
728x90
반응형
반응형
ServerSocket:  특정 포트에서 클라이언트의 연결 요청을 대기하는 서버 소켓을 생성
InputStream : (데이터 송수신) 서버와 클라이언트 간에 데이터를 주기 위해 소켓을 사용
outputStream:  서버로부터 데이터를 받기위해 소켓을 사용

 

 

package socket;

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Ex01 {
	static String getLocalIpaddr() throws Exception{
		Runtime rt = Runtime.getRuntime();		//운영 체제에 명령을 전달할 수 있는 객체
		Process pro = rt.exec("ipconfig");		//명령을 실행하여 프로세스를 지정
		InputStream is = pro.getInputStream();	// 명령의 결과를내 프로그램에 가져오는 입력통로 개설
		Scanner sc = new Scanner(is, "CP949");	// 입력통로의 내용을 지정한 인코딩으로 읽어오는 Scanner
		
		
		while(sc.hasNextLine()) {				// 처리하지않은 줄이 있으면
			String line = sc.nextLine();		// 불러와서
			if(line.contains("IPv4")) {			// "IPv4"를 포함한다면
				sc.close();						// Scanner를 close하고
				return line.split(" : ")[1];	// 결과에서 " : "를 기준으로 분리한 오른쪽 값을 반환
			}
		}
		sc.close();
		
		return null;
	}
	
	public static void main(String[] args) throws Exception {
		String localAddr = getLocalIpaddr();
		System.out.println(localAddr);
		
		ServerSocket ss = new ServerSocket(7777);
		
		System.out.println("접속대기중...");
		Socket so = ss.accept();
		
		String remoteAddr = ss.getInetAddress().toString();
		System.out.println(remoteAddr+ "에서 접속함");
		
		Scanner sc = new Scanner(so.getInputStream());
		String data = sc.nextLine();
		System.out.println(remoteAddr + " : " + data); 
		
		sc.close();
		ss.close();
		
	}

}

 

 

서버가 운영중이여야 클라이언트가 받을 수 있다. 
<서버개설>
이 코드는 Java 언어로 작성된 간단한 소켓 통신 예제이다. 
1. getLocalIpaddr() 메서드는 현재 컴퓨터의 로컬 IP 주소를 가져오는 역할
. 이를 위해 `ipconfig` 명령을 실행하여 결과를 가져오고, 그 중에서 IPv4 주소를 추출하여 반환

2. `main()` 메서드는 프로그램의 진입점  `getLocalIpaddr()`를 호출하여 로컬 IP 주소를 가져와서 출력

3. `ServerSocket` 객체를 생성하여 지정된 포트 번호(여기서는 7777)로 서버 소켓을 개설.

4. "접속대기중..." 메시지를 출력한 후, `accept()` 메서드를 호출하여 클라이언트의 연결 요청을 대기
    클라이언트가 연결되면 해당 클라이언트와 통신할 수 있는 `Socket` 객체가 반환

5. `getInetAddress()` 메서드를 사용하여 클라이언트의 IP 주소를 가져온 다음, 이를 문자열로 변환하여 출력

 6. `Socket` 객체에서 `getInputStream()` 메서드를 호출하여 클라이언트로부터
     데이터를 읽을 수 있는 InputStream 을 얻음. 

7. `Scanner`를 사용하여 클라이언트로부터 전송된 데이터를 읽고, 출력

8. 통신이 끝난 후, 열린 소켓과 스트림을 닫고 프로그램을 종료 


이 코드는 서버와 클라이언트 간의 단방향 통신을 구현한다. 
클라이언트 측에서 데이터를 보내면 서버는 해당 데이터를 읽어 출력

 

 

 

 

클라이언트가 받기위한 코드 

 

package socket;

import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {
	public static void main(String[] args) throws Exception {
		
		Scanner sc = new Scanner(System.in);
		String target;
		String data;
		
		System.out.print("접속할 서버의 IP를 입력:");
		target = sc.nextLine();
		
		Socket so = new Socket(target, 7777);
		PrintWriter pw = new PrintWriter(so.getOutputStream());
		
		System.out.print("보낼 메세지 입력:");
		data = sc.nextLine();
		
		pw.write(data);
		pw.flush();
		pw.close();
		so.close();
		sc.close();
	}

}

 

 

<서버에 요청할 클라이언트 코드>
1.  main메서드는 프로그램 내부진입점

2. `Scanner` 객체를 사용하여 사용자로부터 접속할 서버의 IP 주소를 입력받는다. 

3. 입력받은 IP 주소와 포트 번호 7777을 사용하여 `Socket` 객체를 생성하고 이를 통해 서버에 접속을 시도

4. `PrintWriter` 객체를 생성하여 `Socket`의 출력 스트림을 얻는다. 이를 사용하여 서버로 데이터를 송신

5. 사용자로부터 보낼 메시지를 입력

6. `PrintWriter`의 `write()` 메서드를 사용하여 데이터를 서버로 전송
    flush()메서드를 호출하여 버퍼를 비워 데이터를 실제로 전송

7. `PrintWriter`와 `Socket` 객체를 순서대로 닫아 통신을 종료

8. `Scanner`도 닫아 입력 스트림을 종료

이 코드는 클라이언트가 서버에 접속하여 입력받은 메시지를 서버로 전송하는 기능을 수행한다.
서버는 이후 전송된 메시지를 읽어 출력

 

 

 

서버 개설 코드 

 

 

 

서버에 접속하기 위한 클라이언트 개설

 

 

728x90
반응형