-
TECHIT 앱 스쿨 2기: Android 11일차 (23.05.09)[THEC!T] 앱 스쿨2기 : Android 2023. 5. 9. 23:53728x90
자료 출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 내용
배운 내용은
네트워크의 역사
서버, 클라이언트 설명
ip,포트,프로토콜,소켓 설명
채팅구현4가지 입니다.
시작은 네트워크의 대한 역사에 대하여 설명해주셨는데 이야기가 방대하여 생략하도록 하겠습니다.
정말 간략하게 하자면 폰 노이만 최고~!
서버, 클라이언트(개발자 입장)
간단요약
서버 : 서비스를 제공 및 응답, 정보 제공
클라이언트 : 서비스를 요청 및 받고, 고객에게 서비스를 제공하는 소프트웨어
ip,포트,프로토콜,소켓
ip,포트,프로토콜,소켓 은 서버와 클라이언트가 통신을 할 때 중요한 요소 입니다.
IP : ip 번호로 클라이언트 쪽에서 서버를 찾습니다.
포트 : 클라이언트가 포트 번호로 서버에서 실행 할 프로그램을 찾습니다.
-> 포트는 컴퓨터 시스템 내 서비스를 구분할 번호이므로 절대 중복되어선 안됩니다.
프로토콜 : 프로토콜은 서버와 클라이언트 들이 통신하기 위해 정의된 규칙과 절차의 집합입니다.
즉 데이터의 전송 방식,순서, 통신 포맷,오류 처리 방벙등을 정의 합니다.
소켓 : 소켓은 서버와 클라이언트가 연결되는 통로라고 생각해도 됩니다. 관계는 1 : 1 관계이며, 서버와 클라이언트는
소켓을 통하여 데이터를 주고 받습니다. 서버는 소켓을 다수 가지고 있습니다. 서버에 1명만 접속할 게 아니므로...
그렇기에 서버에서는 소켓관리를 해야합니다.
네트워크와 관련된 개념과 정보는 좀 더 있지만, 현재는 배운 내용을 매우 간략하게 정리하였습니다.
간단하게 서버 클래스와 클라이언트 클래스를 만들어 확인해 보았습니다.
서버 클래스
package com.test.main; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerClass { public static void main(String[] args) { // TODO Auto-generated method stub try { // ServerSocket 객체를 생성한다. // 프로그램이 사용할 포트 번호를 지정한다. ServerSocket server = new ServerSocket(30000); System.out.println("서버 가동"); // 사용자 접속을 대기한다. // 사용자가 접속할 때 까지 대기하며 접속에 성공하면 // 접속한 클라이언트와 1 : 1 로 연결되어 있는 socket이 생성된다. Socket socket = server.accept(); System.out.println(socket); // 데이터를 보낸다. OutputStream os = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); dos.writeInt(100); dos.writeDouble(11.11); dos.writeBoolean(true); dos.writeUTF("서버가 보낸 문자열"); // 클라이언트가 보낸 데이터를 받는다. InputStream is = socket.getInputStream(); DataInputStream dis = new DataInputStream(is); int data1 = dis.readInt(); double data2 = dis.readDouble(); boolean data3 = dis.readBoolean(); String data4 = dis.readUTF(); System.out.println(data1); System.out.println(data2); System.out.println(data3); System.out.println(data4); // 클라이언트와의 연결을 해제한다. socket.close(); // 서버를 종료한다. server.close(); }catch(Exception e) { e.printStackTrace(); } } }
클라이언트 클래스
package com.test.main; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class ClientClass { public static void main(String[] args) { // TODO Auto-generated method stub try { // 서버에 접속한다. // 이때, IP 주소와 포트 번호를 설정해줘야 한다. // 127.0.0.1 : 자기 자신 컴퓨터를 가르키는 IP주소 // 서버와 클라이언트를 같은 컴퓨터에서 개발할 때 사용하는 // 테스트용 IP 주소 Socket socket = new Socket("127.0.0.1", 30000); System.out.println(socket); // 데이터를 받는다. // 스트림 추출 InputStream is = socket.getInputStream(); DataInputStream dis = new DataInputStream(is); int data1 = dis.readInt(); double data2 = dis.readDouble(); boolean data3 = dis.readBoolean(); String data4 = dis.readUTF(); System.out.println(data1); System.out.println(data2); System.out.println(data3); System.out.println(data4); // 서버로 데이터를 보낸다. OutputStream os = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); dos.writeInt(200); dos.writeDouble(22.22); dos.writeBoolean(false); dos.writeUTF("클라이언트가 보낸 문자열"); // 접속해제 socket.close(); }catch(Exception e) { e.printStackTrace(); } } }
출력 결과(상단 서버클래스, 하단 클라이언트 클래스)
채팅 프로그램의 경우 쓰레드를 이용하여 사용자의 접속 대기, 사용자의 메세지 전송 등을 구현하였으나,
현재 저의 컴퓨터 쪽 문제로 cmd에서 설정을 변경해도 문자가 이상하게 나와 수정 후 추가하여 작성 할 수 있도록 하겠습니다. 이클립스 내 콘솔 창으로 할까 했지만 사용자가 1명만 보여 깔끔하지가 않아 포기하였습니다.
늦은 오늘의 마음가짐
스트림부터 날 너무 괴롭히는데 조만간 스트림과 네트워크와 친한 사이인 개발자가 되어야 겠습니다.
'[THEC!T] 앱 스쿨2기 : Android' 카테고리의 다른 글
TECHIT 앱 스쿨 2기: Android 13일차 (23.05.11) (0) 2023.05.11 TECHIT 앱 스쿨 2기: Android 12일차 (23.05.10) (0) 2023.05.10 TECHIT 앱 스쿨 2기: Android 10일차 (23.05.08) (0) 2023.05.08 TECHIT 앱 스쿨 2기: Android 9일차 (23.05.04) (0) 2023.05.05 TECHIT 앱 스쿨 2기: Android 8일차 (23.05.03) (0) 2023.05.04