소켓통신을 일대일 방식으로 하려면 두 개의 소캣이 필요하다
서버 소켓과 클라이언트소켓
그럼 이 두 개의 소켓을 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 |