JAVA,객체지향

소켓통신 실습 (일대일)

25G 2021. 12. 3. 09:50

소켓통신을 일대일 방식으로 하려면 두 개의 소캣이 필요하다

서버 소켓과 클라이언트소켓

그럼 이 두 개의 소켓을 ByteStream으로 연결하는데 ip주소로 서로 통신할 수 있도록 할 것입니다.

포트를 양 끝단에 달고 하는 통신(소켓통신)

 

 

다음과 같은 방식으로 통신이 이루어집니다.

위 그림에는 빠져있지만 클라이언트 소켓은 메시지를 쓰는 쪽이기 때문에 키보드와 연결하는 스트림이 하나 더 있어야 합니다.(클라이언트 파일 소스코드 참고)

 

 

 

서버 소켓 파일

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerFile {

	// 클라이언트 연결을 받는소켓
	ServerSocket serverSocket;
	// 실재 통신을 하는 소캣
	Socket socket;
	BufferedReader br;

	public ServerFile() {
		System.out.println("1. 서버소켓 시작-------------------------------------------------------");
		try {
			serverSocket = new ServerSocket(10000);
			System.out.println("2. 서버소켓 생성완료 : 클라이언트 접속 대기중 ----------------------------------------------");
			socket = serverSocket.accept();// 클라이언트 접속 대기중....
			System.out.println("3. 클라이언트 연결완료-----------------------------------------------------");

			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			// socket.getInputStream()는 클라이언트 소켓을 ByteSream으로 연결후 br에 버퍼를 달았다.

			String msg = br.readLine();
			System.out.println("4. 클라이언트로 부터 받은 메시지 : " + msg);
		} catch (Exception e) {
			System.out.println("서버소켓 에러 발생함 : " + e.getMessage());
		}
	}

	public static void main(String[] args) {

		new ServerFile();

	}

}

서버는 읽어야 하기 때문에 inputStream을 달았지만 클라이언트는 써야 하기 때문에 Writer버퍼를 사용해야 한다.

클라이언트 소켓 파일

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientFile {

	Socket socket;
	BufferedWriter bw;
	BufferedReader br;

	public ClientFile() {
		System.out.println("1. 클라이언트소켓 시작-------------------------------------------------------");
		try {
			socket = new Socket("localhost", 10000);// 해당 소스코드 실행시 서버소켓의 accept() 메서드 호출
			// 내컴퓨터가 서버와 클라이언트를 같이 일을하니까 localhost로 설정
			// 포트번호는 서버와 같이 10000으로 잡아준다.
			System.out.println("2. 버퍼(write)연결 완료-------------------------------------------------------");
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			// 클라이언트는 써야하기때문에 Output해줘야한다.

			// 키보드 연결
			System.out.println("3.키보드 스트림 + 버퍼(read) 연결완료-------------------------------------------------------");
			br = new BufferedReader(new InputStreamReader(System.in));

			System.out.println("4. 키보드 메시지 입력 대기중-------------------------------------------------------");
			String keyboardMsg = br.readLine();
			// 통신의 규칙!!
			// 메세지 끝을 알려줘야한다. \n

			bw.write(keyboardMsg + "\n");
			// 버퍼의 남는 공간을 비워줘야한다.
			bw.flush();

		} catch (Exception e) {
			System.out.println("클라이언트 소켓 에러 발생함 : " + e.getMessage());
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

		new ClientFile();
	}

}

통신 규칙 메시지 끝에 "\n"으로 알려준다

 

'JAVA,객체지향' 카테고리의 다른 글

이벤트 리스너 원리  (0) 2021.12.05
소켓통신 실습 (스레드로 양방향통신)  (0) 2021.12.03
소켓통신 개념(포트(port)개념)  (0) 2021.12.02
버퍼(Buffer)란?  (0) 2021.12.02
String Constant Pool  (2) 2021.12.02