① 서버와 클라이언트
② IP 주소
③ 포트(port)
① 소켓(Socket)
② 프로토콜(Protocol)
③ TCP
④ UDP
< 서버용 TCP 소켓 프로그래밍 순서 >
1. 서버의 포트번호 정함
2. 서버용 소켓 객체 생성
3. 클라이언트 쪽에서 접속 요청이 오길 기다림
4. 접속 요청이 오면 요청 수락 후 해당 클라이언트에 대한 소켓 객체 생성
5. 연결된 클라이언트와 입출력 스트림 생성
6. 보조 스트림을 통해 성능 개선
7. 스트림을 통해 읽고 쓰기
8. 통신 종료
//1 서버의 포트번호 정함 int port 8500; // port 번호는 0~65535 사이 지정 ServerSocket serverSocket = null; Socket clientSocket = null; InputStream is = null; BufferedReader br = null; OutputStream os = null; PrintWriter pw = null; try { // 2 서버용 소켓 객체 생성 // 3 클라이언트 요청 기다림 serverSocket = new ServerSocket(port); System.out.println("[Server]"); System.out.println("클라이언트 요청을 기다림"); // 4 접속 요청이 오면 요청 수락 후 클라이언트 소켓 객체 생성 clientSocket = serverSocket.accept(); String clientIP = clientSocket.getInetAddress().getHostAdress(); System.out.println(clientIP + "가 연결을 요청함"); // 5 연결된 클라이언트와 입출력 스트림 생성 is = clientSocket.getInputStream(); os = clientSocket.getOutputStream(); // 6 보조 스트림을 통한 성능 개선 br = new BufferedReader(new InputStreamReader(is)); pw = new PrintWriter(os); // 7 스트림을 통해 읽고 쓰기 pw.println("[서버 접속 성공]"); pw.flush(); // 클라이언트가 서버에게 보낸 메시지 받기 String message = br.readLine(); System.out.println(clientIP + "가 보낸 메시지 : " + message); } catch ( IOException e ) { e.printStackTrace(); } finally { // 8 통신 종료 tri { if(pw != null) pw.close(); if(br != null) br.close(); if(serverSocket != null) serverSocket.close(); if(clientSocket != null) clientSocket.close(); } catch ( IOException e ) { e.printStackTrace(); } }
< 클라이언트용 TCP 소켓 프로그래밍 순서 >
1. 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체 생성
2. 서버와의 입출력 스트림 오픈
3. 보조 스트림을 통해 성능 개선
4. 스트림을 통해 읽고 쓰기
5. 통신 종료
// 1 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 String serverIP = "127. 0. 0. 1"; // loop back ip (내 컴퓨터를 가리키는 ip 주소) int port = 8500; Socket clientSocket = null; BufferedReader br = null; PrintWriter pw = null; try { // 클라이언트용 소켓 객체 생성 System.out.println("[Client]"); clientSocket = new Socket(serverIP, port); // 2 서버와 입출력 스트림 오픈 // 3 보조스트림을 통해 성능 개선 br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()); pw = new PrintWriter(clientSocket.getOutputStream()); // 4 스트림을 통해 읽고 쓰기 String message = br.readLine(); System.out.println("서버로부터 받은 메시지 : " + message); Scanner sc = new Scanner(System.in); System.out,print("입력 : "); String input = sc.nextLine(); pw.println(input); // 작성한 메시지 밀어내기 pw.flush } catch ( IOException e ) { e.printStackTrace(); } finally { // 5 통신 종료 try { if(pw != null) pw.close(); if(br != null) br.close(); if(clientSocket != null) clientSocket.close(); } catch( IOException e) { e.printStackTrace(); } }
< 서버용 UDP 소켓 프로그래밍 순서 >
1. 서버의 포트번호 정함
2. DatagramSocket 객체
3. 연결한 클라이언트 IP주소를 가진 InetAddress 객체 생성
4. 전송할 메시지를 byte[]로 바꿈
5. 전송할 메시지를 DatagramPacket 객체에 담음
6. 소켓 레퍼런스를 사용하여 메시지 전송
7. 소켓 닫음
< 클라이언트용 UDP 소켓 프로그래밍 순서 >
1. 서버가 보낸 메시지를 받을 byte[] 준비
2. DatagramSocket 객체 생성
3. 메시지 받을 DatagramPacket객체 준비
4. byte[]로 받은 메시지를 String으로 바꾸어 출력
5. 소켓 닫음