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
반응형