-
[Java] 소켓 통신(socket)프로그래밍/JAVA 2022. 8. 15. 14:20728x90
들어가기 앞서 관련 용어 정리
네트워크(Network) : 컴퓨터들이 통신 기술을 이용하여 그물망처럼 연결된 통신 이용형태
인터넷(Internet) : 컴퓨터로 연결하여 TCP/IP 프로토콜을 이용하여 정보를 주고 받는 네트워크
IP(internet protocol) : 인터넷의 연결되어있는 모든 장치를 식별할 수 있도록 장비에게 부여되는 고유주소
포트(Port) : 컴퓨터나 통신장비에서 다른 장치에 물리적으로 접속되는 특정한 통로
소켓(socket) : 두 호스트 사이 연결, 어떠한 방식으로 통신을 할지 정해주는 것
버퍼(buffer) : 입출력을 수행하는데 있어 속도차이를 극복하기 위해 사용하는 임시 저장 공간. 프로그래밍이나 운영체제에서 CPU와 보조기억장치 사이에서 사용되는 임시 저장 공간을 뜻함
Socket 통신 일련의 절차
- server 측에서 port를 열고 client의 접속을 기다한다.
- client 측에서 server의 ip 주소와 port 번호를 통해 server 소켓에 접근한다.
- server 소켓은 client 가 접속을 했는지 체크하는 용도로만 사용한다.
client 접속 server 서버 ip, port -----> 서버 소켓
소켓 생성 방법
서버 소켓 생성 ServerSocket 참조변수 = new ServerSocket(포트번호); 클라이언트 소켓 생성 Socket 참조변수 = new Socket("아이피주소", 포트번호)
client가 server로 접근하는 코드를 작성해보면,
// server import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server1 { public static void main(String[] args) { int port = 9999; try{ ServerSocket serverSocket = new ServerSocket(port); System.out.println("클라이언트를 기다리고 있습니다."); while(true){ // 새로운 클라이언트가 접속시 클라이언트 소켓을 생성 Socket socket = serverSocket.accept(); System.out.println("클라이언트가 접속했습니다."); System.out.println("Client ip : " + socket.getInetAddress()); } }catch (IOException e){ e.printStackTrace(); } } }
먼저 server가 server소켓을 생성하여 client의 접근을 기다리게된다. while 문을 통해 client의 접근을 확인한다.
접근 확인이 되면 Socket을 생성한다.
// client import java.io.IOException; import java.net.Socket; public class Client1 { public static void main(String[] args) { try{ Socket socket = new Socket("127.0.0.1", 9999); // 서버 포트번호와 일치하면 연결 System.out.println("서버와 접속이 되었습니다."); }catch (IOException e){ e.printStackTrace(); } } }
client는 server의 ip과 port 번호를 이용하여 연결이 확인되면 소켓을 생성한다. 그렇지 않다면 예외처리된다.
// 실행결과(server) 클라이언트를 기다리고 있습니다. 클라이언트가 접속했습니다. Client ip : /127.0.0.1
// 실행결과(client) 서버와 접속이 되었습니다.
client - server 간 메세지 보내기
import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server2 { public static void main(String[] args) { try{ ServerSocket serverSocket= new ServerSocket(9999); System.out.println("서버 소켓 생성됨"); Socket socket = serverSocket.accept(); System.out.println("클라이언트가 접속 했습니다."); System.out.println("Client ip : " + socket.getInetAddress()); // client로 부터 전송받은 데이터을 저장 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true){ String data = br.readLine(); // client로 전송받은 데이터를 읽어 data에 저장 if(data.equals("Q") || data.equals("q")){ // 전송받은 데이터 중 Q,q 가 있을 시 프로그램 종료 System.out.println("프로그램 종료"); break; } System.out.println("Client 메시지 : " + data); // 클라이언트가 보낸 데이터 출력 } br.close(); socket.close(); }catch (IOException e){ e.printStackTrace(); } } }
import java.io.*; import java.net.Socket; public class Client2 { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1" , 9999); // 서버로 보내는 역할 PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); // 키보드로 읽어들임 BufferedReader key = new BufferedReader(new InputStreamReader(System.in)); while(true){ System.out.print("메시지 입력 : "); String data = key.readLine(); // 키보드로 입력 받은 값을 읽어 data에 저장 if(data.equals("Q")|| data.equals("q")){ System.out.println("채팅 종료"); break; } pw.println(data); // 서버로 data 값 보내기 pw.flush(); // 항상 Writer 는 flush()로 버퍼 내 데이터 비우기 } pw.close(); socket.close(); key.close(); }catch (IOException e){ e.printStackTrace(); } } }
// 실행결과(server) 서버 소켓 생성됨 클라이언트가 접속 했습니다. Client ip : /127.0.0.1 Client 메시지 : 안녕하세요 Client 메시지 : 반갑습니다.
// 실행결과(client) 메시지 입력 : 안녕하세요 메시지 입력 : 반갑습니다. 메시지 입력 : q 채팅 종료
728x90'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] LocalDateTime (0) 2022.08.16 [Java] swing (0) 2022.08.16 [Java] 람다 표현식(lambda expression) (0) 2022.08.15 [Java] 스레드 동기화(Thread Synchronization) (0) 2022.08.14 [Java] 스레드(thread) (0) 2022.08.14