양재만.hwp


 

 


목차

 

. 프로젝트 실행 동기 및 목적

- 프로젝트 기획 배경 ------------------------------------------------ 3p

- 프로젝트의 목적 ------------------------------------------------ 3p

- 개발환경 ------------------------------------------------ 3p

. 이론적 배경(기존 사례 또는 문헌 연구 결과)

- 소켓통신 ------------------------------------------------ 4p

- 데이터베이스 ------------------------------------------------- 6p

- 안드로이드 ------------------------------------------------ 7p

- 다이얼로그 ------------------------------------------------ 7p

- 기존의 유사한 프로그램 ------------------------------------------------ 8p

- 알고리즘과 프로젝트의 방향 -------------------------------------------- 8p

. 프로젝트 방법 및 과정

- 서버소켓 ------------------------------------------------ 9p

- 클라이언트소켓 ------------------------------------------------ 12p

- 개발 중 발생한 문제점들 ------------------------------------------------ 18p

. 프로젝트 결과

- 프로젝트의 결과 ------------------------------------------------ 19p

. 결론 및 고찰

- 앞으로의 프로젝트 개발 방향 ------------------------------------------- 21p

참고문헌

-소스코드 ------------------------------------------------ 22p

 

. 프로젝트 실행 동기 및 목적

 

- 프로젝트 기획 배경

나는 평소에도 잠이 많아 아침에 일어나기가 쉽지 않다. 어떻게 하면 아침에 쉽게 일어날 수 있을까 생각해 보다 누군가가 알람을 대신 실행시켜주는 프로그램이 있으면 어떨까 생각하게 되었다.

 

 

- 프로젝트의 목적

프로젝트의 목적은 사용자가 다른 사용자의 스마트 폰의 알람을 on/off 할 수 있는 프로그램 제작이었지만 개발 가능성이 희박하다. 그렇기 때문에 다른 사용자의 스마트 폰에 설치된 어플리케이션의 알람을 on/off 할 수 있는 프로그램 개발을 진행하기로 하였다.

 

 

- 개발 환경

 

개발 언어: Java, Android

개발 환경: Windows 8.1 64bit

실행 환경: Android Application

개발 툴: eclipse, Android Studio

 

 

 

 

 

 

 

 

 

. 이론적 배경(기존 사례 또는 문헌 연구 결과)

소켓 통신

 

소켓이란 네트워크를 통해서 여러 대의 컴퓨터들에서 실행되는 프로세스간의 통신 채널의 한 종류이다. 소켓의 통신 방법으로는 TCP 방식과 UDP 방식으로 나눠진다.

항목

TCP

UDP

연결방식

연결기반 (connection-oriented), 연결 후 통신, 1:1 통신 방식

비연결기반(connectionless-oriented) 연결없이 통신(소포), 1:1, 1:n, n:n, 통신방식

특징

데이터의 경계를 구분안함 (byte-stream). 신뢰성 있는 데이터 전송

데이터의 전송순서가 보장됨, 수신여부를 확인함 (손실되면 재전송)

패킷을 관리할 필요가 없음, UDP보다 전송속도가 느림

데이터의 경계를 구분함(datagram), 신뢰성이 없는 데이터 전송

데이터의 전송순서가 바뀔 수 있음, 수신여부를 확인 안함 (데이터가 손실되어도 알 수 없음)

패킷을 관리해줘야 함, TCP보다 전송속도가 빠름

관련 클래스

Socket, ServerSocket

DatagramSocket, DatagramPacket, MulticastSocket

TCP 방식과 UDP 방식을 간단하게 나타낸 표이다.

출처(http://gangzzang.tistory.com/entry/Java-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)

 

 

 

표와 같이 TCP 방식은 연결 후 통신이다. 연결 후 통신이란 사용자의 컴퓨터에 실행되는 프로세스와 다른 사용자의 프로세스가 정상적으로 연결이 되어야 서로의 컴퓨터끼리 통신이 가능하게 되는 방식이다. 이와 반대로 UDP 방식은 연결 없이 통신을 하는 방식이다. 즉 사용자들의 컴퓨터의 연결이 이루어지지 않은 상태로도 데이터를 보낼 수 있다.

 

TCP - 연결지향이며, 자체적으로 오류를 처리하며, 네트워크 전송 도중 순서가 뒤바뀐 메시지를 교정시켜주는 기능을 가지고 있다. 연결지향이란 말은 데이터를 전송하는 측과 데이터를 전송받는 측에서 전용의 데이터 전송 선로(Session)를 만든다는 의미이다. 데이터의 신뢰도가 중요하다고 판단될 때 주로 사용된다.

 

그림입니다.

원본 그림의 이름: 2.png

원본 그림의 크기: 가로 394pixel, 세로 308pixel 이 그림은 TCP 방식을 그림으로 나타낸 것이다.

 

UDP - 비연결지향이며, 오류를 처리하거나 순서를 재조합시켜주는 기능을 가지고 있지 않다. 단순히 데이터를 받거나, 던져주기만 하는 프로토콜이다. UDP는 특히 실시간 멀티미디어 정보를 처리하기 위해서 주로 사용한다.

 

그림입니다.

원본 그림의 이름: 1.png

원본 그림의 크기: 가로 447pixel, 세로 486pixel 이 그림은 UDP 방식을 그림으로 표현한 것이다.

 

출처(http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/IntroTCPIP 3번 항목)

데이터베이스

 

데이터베이스는 작성된 목록으로써 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 묶음이다. 데이터베이스에는 장점과 단점이 있다.

장점

단점

데이터 중복 최소화

데이터베이스 전문가 필요

데이터 저장 공간 절약

데이터 백업과 복구가 어려움

일관성, 무결성, 보안성 유지

시스템의 복잡함

위 표는 데이터베이스의 장단점을 표로 만들어 놓은 모습이다.

출처https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4#.EB.8D.B0.EC.9D.B4.ED.84.B0.EB.B2.A0.EC.9D.B4.EC.8A.A4.EC.9D.98_.EC.9E.A5.EB.8B.A8.EC.A0.90

 

데이터베이스를 사용하는 가장 큰 장점은 데이터 저장 공간을 절약하고 관리하기 쉽다는 점이다.

하지만 절약과 관리가 되는 만큼 시스템이 복잡해지고 데이터베이스에 대한 전문적인 지식이 있어야 한다는 단점이 있다.

주로 데이터베이스를 이용하는 것은 주로 사용자의 개인정보를 저장하는 용도로 많이 사용한다.

또한 데이터베이스를 사용하기 위해서는 SQL이라는 언어를 알아야한다.

SQL란 관계형식의 데이터베이스의 데이터를 관리 및 처리하기 위해서 설계된 프로그래밍 언어다.

SQL은 크게 데이터정의언어, 데이터 조작언어, 데이터 제어언어 로 3가지 문법으로 구분할 수 있다. 데이터 정의언어는 테이블과 인덱스 값을 관리하고, 데이터 조작언어는 데이터를 쓰거나 읽거나 지우는데 사용한다.

마지막으로 데이터 제어언어는 권한 부여 및 트랜잭션 관리에 사용된다.

 

 

안드로이드

 

안드로이드는 OHA에서 개발된 운영체제와 미들웨어 및 핵심 모바일 어플리케이션을 포함한 모바일 기기를 위한 소프트웨어 스택이라고 할 수 있습니다. 또한 안드로이드는 공개된 리눅스 커널을 기반으로 하고 있습니다. 쉽게 모바일 기기를 위한 하나의 OS이다.

 

이 프로젝트에서는 안드로이드 환경에서 개발을 하였다.

그 이유는 안드로이드는 풍부한 어플리케이션을 구축하는데 사용할 수 있는 광범위한 유용한 라이브러리들을 제공하여 보다 빠르고 쉽게 어플리케이션을 구축하기 쉽고 또한 오픈소스 등의 유용한 자료가 많이 공개되어 있기 때문에 안드로이드 어플리케이션으로 만들게 되었습니다.

 

다이얼로그

다이얼로그란 사용자에게 정보를 보여 주거나 응답을 받는 사용자 인터페이스에서 사용되는 특별한 창이다. 다이얼로그의 종류에는 2가지가 있다.

모달방식 2. 모달리스방식

모달방식

 

모달 창이 열렸을 때는 기존의 창을 이용하지 못한다.

제어 권을 독점하여 모달 창을 종료하기 전까지는 기존 창을 작업할 수 없는 방식

ex) visual studio의 정보대화 상자

 

모달리스방식

 

모달과는 반대의 개념으로 새로운 창이 열리더라도 기존의 창에서 작업을 할 수 있다. 사용자의 동작에 관계없이 프로그램 상태를 일관성 있게 유지시켜야 하는 과정에서 모달방식보다 프로그래밍이 더 어렵다.

ex) visual studio의 편집메뉴

 

프로젝트에서 다이얼로그를 띄운 상태에서는 다른 작업을 하면 안 되기 때문에 모달방식으로 프로그램을 제작하였다.

 

기존의 유사한 프로그램

 

커플 어플리케이션

 

카카오 톡

 

알람

 

프로젝트의 프로그램과 비슷한 기능을 가진 기존 프로그램들은 위와 같이 크게 3가지로 나눌 수 있다.

 

비고

카카오 톡

커플 어플리케이션

알람

유사한 점

소켓통신을 이용하여 메시지를 보낸다.

서로 연결을 한다.

일정한 행동을 명령받으면 소리를 출력한다.

다른 점

메시지가 아닌 명령을 보낸다.

X

상대방이 명령을 보내면 실행된다.

 

1번은 소켓통신을 이용하여 메시지를 보낸다는 것이다. 하지만 그저 채팅과 같은 메시지가 명령으로써 서버에서 실행되는 행동을 명령한다.

 

2번과 제작하고자 하는 프로그램과 유사한 점은 서로 연결을 한다는 점이다. 연결을 하는 것 외에는 대부분이 다르기 때문에 서술하지 않았다.

 

3번은 일정한 시간 즉 일정한 행동을 명령받으면 소리를 출력해주는 프로그램이기 때문에 비슷하다. 하지만 일정한 시간 또는 사용자가 원하는 시간이 아닌 사용자와 연결이 되어있는 다른 사용자의 어플리케이션에서 명령이 올 때 실행이 된다.

 

 

알고리즘과 프로젝트의 방향

 

프로젝트의 실행은 우선적으로 사용자와 사용자의 연결이 정상적으로 이루어졌을 때만 정상적인 실행이 가능하다. 사용자와 다른 사용자의 연결을 위해서는 사용자마다 각각의 정보가 있어야한다. 그렇기 때문에 회원가입시스템을 사용하게 되었다. 회원가입시스템을 사용하면서 사용자의 개인정보를 관리할 공간으로 데이터베이스를 사용하였다. 이렇게 생성된 사용자의 개인정보에 사용자의 소켓번호를 KEY값으로 데이터베이스에 함께 저장시켜 자신이 연결하고자 하는 사용자에게 연결요청을 보내고 검색하는 용도로 사용을 하게 되었다. 연결이 된 후 깨우기 버튼을

누르면 자신과 연결되어있는 사용자의 스마트폰에서 미리 설정된 음악파일이 실행되게 된다.

 

 

 

 

 

 

. 프로젝트 방법 및 과정

 

프로젝트에 주로 사용된 기능은 위에서 설명한 소켓통신과 데이터베이스이다.

 

 

서버소켓

그림입니다.

원본 그림의 이름: 도표1.png

원본 그림의 크기: 가로 717pixel, 세로 446pixel

 

위 그림은 서버가 하는 일을 간략하게 설명한 것이다.

위 그림에서 알 수 있듯이, 서버는 여러 클라이언트로부터 받는 데이터를 서버 내부에서

관리하고 처리하여 나온 명령들을 다른 클라이언트로 보내준다. 그 후 작업은 클라이언트 내부에서 실행된다.

 

서버는 총 3가지의 주요 명령을 받는다.

join (회원가입)

2. connect (상대방과 연결)

3. Wake_up (깨우기)

 

1번과 2번의 경우는 데이터베이스와 연동되어 실행된다.

이 과정에서 이클립스와 데이터베이스의 연동이 필요하였다.

이클립스와 데이터베이스의 연동에는 이클립스 SQL Explorer플러그인, 또는 JDBC 드라이버를 사용하는 방법이 있다. 이클립스 SQL Explorer플러그인은 간단한 데이터베이스사용, 간단한 데이터베이스의 자료검색 등의 작업에 편리하다. JDBC 드라이버는 자바에서 데이터베이스 접근을 위한 표준 플랫폼이다. 그렇기 때문에 많은 데이터베이스연동 예시가 있다. SQL Explorer플러그인도 예제가 없지는 않지만 JDBC보다 자세한 예제들이 많이 있지 않았다. 그러한 이유로 나는 JDBC를 이용하여 이클립스와 데이터베이스를 연동하였다.

 

1번에서는 회원가입을 원하는 명령어를 받으면 사용자가 입력하는 이름, 닉네임, 아이디, 비밀번호, 전화번호, 이메일을 임시로 저장하여 데이터베이스에 저장하게 된다.

그림입니다.

원본 그림의 이름: 도표1.png

원본 그림의 크기: 가로 723pixel, 세로 683pixel

 

 

 

 

 

Name: 사용자의 이름

Nic_Name: 사용자의 닉네임

ID: 사용자의 아이디

PW: 사용자의 비밀번호

TEL: 사용자의 전화번호

E-MAIL: 사용자의 이메일

 

 

 

 

위 그림은 사용자가 회원가입을 진행할 때 서버에서 데이터베이스로 저장하는 과정을 표현한 것이다.

 

회원가입 시 작동하는 과정은 클라이언트에서 회원가입의 데이터를 받고 서버에서 처리 후 명령문과 함께 데이터베이스에 전송한다. 데이터베이스에서는 명령문에 해당하는 동작을 하며 서버로부터 받은 데이터를 저장하게 된다.

String sql = "insert into join_database.test values(" + socket_num + "," + "'" + name + "'" + "," +"'"+ nic_name + "'" + "," + "'"+ id + "'" + "," + "'" + pw + "'" + "," + "'" + tel + "'" + "," + "'" + e + "'" + ")";

 

위 코드가 데이터베이스로 명령과 데이터를 함께 보내는 코드이다.

 

 

 

 

2번에서는 데이터베이스 테이블의 자료를 검색하고 해당하는 자료의 값을 추출해내어 그 추출해온 값을 토대로 사용자들의 연결을 가능하게 만들어준다.

 

1번의 경우는 데이터베이스에 자료를 삽입한다면 2번은 데이터베이스에서 값을 추출한다.

그림입니다.

원본 그림의 이름: 도표1.png

원본 그림의 크기: 가로 396pixel, 세로 447pixel 2번의 작동을 그림으로 표현

위 그림과 같이 먼저 서버에서 데이터베이스로 명령을 보낸다. 그럼 데이터베이스에서는 그 명령을 받아 그 명령에 해당하는 동작을 한다. 1번에서 데이터베이스가 서버에서 보내는 자료를 저장하는 동작을 한다면 2번에서는 데이터베이스 테이블 내에 있는 모든 자료들 중에 서버가 보낸 데이터와 일치하는 데이터를 찾는다.

ex) 서버에서 사용자의 닉네임 A를 보냈다. 데이터베이스에는 A,B,C의 닉네임을 가진 사용자의 개인정보가 있다. 그럼 데이터베이스에서는 0번 인덱스부터 인덱스의 끝까지 검색을 한다. 만약 데이터가 있다면 그 데이터가 포함된 정보 즉 사용자의 모든 개인정보를 추출할 수 있다.

 

이와 같은 방법으로 연결요청을 받는 사람의 닉네임을 클라이언트에서 입력받아 서버로 전송되고 서버에서 데이터베이스로 명령과 함께 전달하여 찾고자하는 사용자의 정보를 추출해 낼 수 있었다.

 

 

클라이언트 소켓

 

클라이언트는 사용자의 스마트폰에 설치되는 어플리케이션을 말한다.

클라이언트는 사용자가 원하는 기능을 수행할 때 명령문을 서버로 보내고 서버에서 처리된 명령을 받아 클라이언트 내부에서 그 명령에 해당하는 동작을 수행한다.

 

그림입니다.

원본 그림의 이름: 도표1.png

원본 그림의 크기: 가로 346pixel, 세로 215pixel

위 그림은 클라이언트가 명령문을 보내 작동하는 동작을 그림으로 표현한 것이다.

 

그림입니다.

원본 그림의 이름: 캡처.PNG

원본 그림의 크기: 가로 379pixel, 세로 649pixel 위 그림에서 알 수 있듯이, 클라이언트는 서버로 데이터를 보낸다. 서버는 그 데이터를 판별하여 데이터에 해당하는 명령을 서버로 보낸다. 클라이언트는 그 명령을 받게 되면 그에 해당하는 동작을 클라이언트 내부에서 실행하게 된다.

 

 

 

 

 

 

 

 

 

현재 클라이언트의 모습 옆의 사진과 같이 클라이언트에서 서버로 명령을 전송하는 기능은 총 3가지이다.

1. 회원가입

2. 상대방과 연결

 

3. 깨우기 , Start

 

1번의 경우는 클라이언트에서 사용자의 이름,아이디,비밀번호,전화번호,이메일을 입력받는다. 이 과정은 다이얼로그를 이용하여 처리하였다.

그림입니다.

원본 그림의 이름: 캡처.PNG

원본 그림의 크기: 가로 374pixel, 세로 666pixel 회원가입 버튼을 누르면 생기는 다이얼로그

이름,아이디,비밀번호,전화번호,이메일을 입력받으면 그 데이터를 클라이언트에서 서버로 전송시킨다.

서버로 전송할 때 먼저 명령을 보내고 그 뒤에 데이터를 보낸다. 서버에서는 설명했던 것과 같이 먼저 명령을 받고 그 명령에 해당되는 코드를 실행한다.

 

 

 

그림입니다.

원본 그림의 이름: 도표1.png

원본 그림의 크기: 가로 700pixel, 세로 428pixel

회원가입 시 데이터의 전송과정을 그림으로 표현

 

2번은 상대방과의 연결이다.

2번에서는 먼저 자신이 연결요청을 보내고 싶은 사용자의 이름을 입력하고 같이 보내고 싶은 메시지를 입력한다. 이 과정 또한 다이얼로그를 사용하였다.

 

사용자는 자신과 연결을 하고 싶은 상대방의 이름을 입력한다. 그 후 그 상대방에게 보내는 메시지를 입력한다. 그렇게 입력된 이름과 메시지는 서버로 전송되게 된다.

이때 보내는 사용자의 이름도 함께 전송된다.

 

서버는 그 데이터를 받아서 이름을 통하여 데이터베이스에서 소켓번호를 추출해 그 소켓번호로 보내는 사람의 이름과 메시지를 담은 명령을 추출한 소켓번호의 클라이언트로 전송시켜준다.

그림입니다.

원본 그림의 이름: 캡처.PNG

원본 그림의 크기: 가로 380pixel, 세로 673pixel 현재 개발된 연결창의 이미지

 

그림입니다.

원본 그림의 이름: 도표1.png

원본 그림의 크기: 가로 823pixel, 세로 552pixel

클라이언트 A에서 B로 메시지를 보내는 과정을 그림으로 나타낸 것이다.

 

 

 

연결요청을 받은 클라이언트는 명령에 해당하는 행동을 한다.

연결요청에서는 아래와 같이 다이얼로그를 이용하여 연결요청이 왔다는 것을 사용자에게 알린다.

 

 

그림입니다.

원본 그림의 이름: 캡처.PNG

원본 그림의 크기: 가로 291pixel, 세로 258pixel 이 사진은 연결을 요청하는 사진이다.

 

그림입니다.

원본 그림의 이름: 캡처.PNG

원본 그림의 크기: 가로 374pixel, 세로 176pixel

위 사진은 연결요청을 받은 사진이다.

 

위 사진들과 같이 연결요청을 받으면 사용자의 이름과 메시지가 연결요청을 받은 클라이언트로 전송되어 다이얼로그로 출력되게 된다.

여기서 연결요청을 받은 사용자가 확인을 누르게 되면 서버로 연결요청을 수락했다는 명령을 보내준다. 서버가 그 명령을 받으면 연결요청을 보낸 사용자의 데이터와 연결요청을 수락한 사용자의 데이터를 서버내의 저장 공간에 저장한다.

 

 

 

 

 

 

3번은 사용자가 자신과 연결된 사용자에게 명령을 보내 다른 사용자의 어플리케이션에서 소리가 난다.

 

사용자 A와 사용자 B가 연결된 상태일 때 AB를 깨우고 싶다면 깨우기 버튼을 누르게 된다. 깨우기 버튼을 누르면 깨우기 명령에 해당하는 명령을 서버에 전송한다. 서버는 그 명령을 받아 A와 연결된 사용자를 서버자체의 저장 공간에서 검색하여 데이터를 찾아낸 후 B라는 클라이언트에 명령을 전송하게 된다.

그림입니다.

원본 그림의 이름: 도표1.png

원본 그림의 크기: 가로 659pixel, 세로 346pixel

위 그림은 클라이언트 A에서 B로 데이터를 전송하는 과정이다.

 

클라이언트A에서 클라이언트B로 데이터를 보내면 클라이언트B는 그 데이터를 받고

어플리케이션 내부에 저장되어있는 음악파일을 재생한다.

클라이언트A에서는 깨우기 버튼을 한번 누르면 버튼의 상태가 변한다.

이때 버튼을 한 번 더 누르게 되면 클라이언트B에 명령이 전달되어 음악파일이 정지된다. 이는 클라이언트B의 사용자가 직접 종료를 하고 다시 잠들 수 있는 상황을 대비한 것이다.

 

 

 

 

 

 

 

 

개발 중 발생한 문제점

 

1. Could not open mysql.plugin table. Some plugins may be not loaded

SQL을 처음 사용할 때 오류가 발생하였다. 해결방법은 다시 삭제하고 설치한 후 my.ini파일에서 utf-8set-up해줬다.

오류가 난 원인은 설정되어있지 않은 utf-8의 문자속성을 추가하였기 때문이다.

 

2. 쓰레드 안에서의 UI구현

기본적으로 Android에서는 쓰레드 안에서의 UI변경에 제한을 두고 있다.

그러한 이유로 인하여 쓰레드 안에서 UI의 변경을 시도할 시 오류가 발생하였다.

오류의 해결 방법은 RunOnUIThread방법이다.

RunOnUIThread방법이란 Activity에서 Thread를 호출 하였을 경우에 사용할 수 있는 메소드이다. 이 메소드를 사용하게 되면 그 메소드 안에서만 UI의 변경이 가능하게 된다. 하지만 이 메소드는 MainActivity안에서만 사용이 가능하다는 단점이 있다.

 

3. ArrayList<ArrayList<String>>(); 으로 연결된 데이터를 관리

위에 방법으로 시도 ArrayList안의 ArrayList<String>의 값이 달라지면 ArrayList의 값도 변경되는 문제점 발생

검색 후 ArrayList<String[]>의 방식으로 새로운 String형 배열을 생성하면서 ArrayList에 저장

 

4. 회원가입 시 SQL인젝션

회원가입 테스트 중 SQL인젝션 현상을 발견 SQL인젝션이란 SQL을 연동시킨 후 명령을 전송할 때 SQL소스에 문제를 발생시킬 수 있는 명령어 등을 입력하여 프로그램에 오류를 발생시키는 것이다. 이러한 문제점을 없애기 위하여 클라이언트에서 회원가입 시 필터 기법을 사용하였다.

 

Pattern pattern = Pattern.compile("[a-zA-Z--]*$");

 

 

 

 

 

 

 

 

 

 

. 프로젝트 결과

 

구현 된 기능 : 회원가입, 데이터베이스 연동, 상대방에게 연결요청 메시지 전송,

알람 기능

 

프로젝트를 진행하면서 알 수 없는 오류로 인하여 프로젝트가 중단되었다.

그림입니다.

원본 그림의 이름: 캡처.PNG

원본 그림의 크기: 가로 1365pixel, 세로 633pixel

위 사진을 보면 equls에 데이터를 저장하는 부분이 없다. 하지만 equlsjoin이라는 값이 저장된다. 또한 System.out.println(equls);에서 join이 출력되어야 정상이지만 출력 값이 없다.

그림입니다.

원본 그림의 이름: 캡처.PNG

원본 그림의 크기: 가로 1236pixel, 세로 539pixel

사진에서 볼 수 있듯이 equls에는 값이 제대로 들어간다. 출력 또한 정상적으로 이루어진다.

프로그램 자체의 로직이 서로 꼬여버려서 발생한 문제인지, 프로세스 내부에서 문제점이 있는 것인지 더 조사를 해봐야 할 것 같다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. 결론 및 고찰

현재 개발된 부분은 회원가입, 깨우기, 상대방과 연결기능이다. 하지만 오류가 발생하여 그 오류를 해결하는 과정에서 많은 시간이 소요될 것 같다.

나의 생각으로는 오류가 소스코드상의 문제가 아닌 프로세스적인 문제일 것 같다.

한번 값을 추적해봐야겠지만 데이터를 받지 않고 자동적으로 저장이 되기 위해서는 소스코드 내부에서가 아닌 소스코드를 실행하는 도중의 문제일 가능성이 크다고 생각한다.

또한 프로젝트를 여기서 그만두는 것이 아니라, 어떤 부분에서 오류가 발생하는지, 발생한다면 이유는 무엇인지를 찾아내어 처음부터 끝까지 설계를 하고 설계를 기반으로 개발을 할 것이다.

 

추가할 기능

 

11 연결이 아닌 1n연결을 통하여 친구목록을 생성, 친구목록에서 깨우고 싶은 친구를 선택 후 깨우는 기능

 

페이스 북 연동을 통해 보다 쉽게 친구목록을 불러온다.

 

채팅기능 추가

 

위젯기능 추가

 

 

 

참고문헌

 

1. TCP/IP 29p ~ 74p 소켓 프로그래밍에 대한 이해

 

2. Do it! 안드로이드 앱 프로그래밍 440p ~450 p 쓰레드 관련 부분

 

3. http://lapislazull.tistory.com/80 다이얼로그

 

4. http://gangzzang.tistory.com/entry/Java-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

소켓 프로그래밍

 

5. http://ra2kstar.tistory.com/134 데이터베이스 연동

사용된 부분

소스코드

설명

서버소켓통신

serverSocket = new ServerSocket(7777);

서버소켓과 클라이언트소켓을 연결시켜주는 채널을 생성한다. 이때 채널은 7777번 포트이다.

socket = serverSocket.accept();

서버소켓에 연결을 요청하는 소켓정보를 socket에 저장한다. 이때 소켓의 연결요청이 오지 않으면 다음 문장으로 넘어가지 않고 계속 기다린다.

ArrayList<Socket> socketlist

socketlist.add(socket);

ArrayList를 사용하여 접속한 소켓의 정보를 socketlist에 저장한다.

클라이언트

소켓통신

socket = new Socket(ip,7777);

socketip의 주소의 7777번 포트에 연결요청을 보낸다.

Data INput/

Output

input = new DataInputStream(socket.getInputStream());

모든 소켓의InputStream을 저장한다.

input.readUTF();

input으로 보내진 데이터를 읽어온다.

output = new new DataOutputStream(socketlist.get(1).getOutputStream());

Arraylist에 저장된 소켓들중 x번째 소켓의 정보의 OutputStream을 저장한다.

output.writeUTF("Data“);

output에 저장된 소켓에 Data를 전송한다.

데이터베이스

DriverManager.getConnection("jdbc:mysql://localhost", "A", "1");

자바를 통해 연동된 데이터베이스에 로그인한다. USER이름은 A이고 비밀번호는 1이다.

stmt = conn.createStatement()

stmt.executeQuery(sql_key1)

stmt를 사용가능한 상태로 만들어주고 sql_key에있는 명령을 실행시킨다.

rs = stmt.getResultSet();

위에서 실행된 명령을 통해 나온 결과를 rs에 저장한다.

rs.getString("name");

테이블에서 name이라는 항목의 데이터를 얻어온다.

안드로이드

MediaPlayer music;

music.start();

music.stop();

music.prepare();

안드로이드에서 미디어 파일을 실행시키기 위해 필요하다. start()는 실행

stop()은 정지

prepare()은 정지 상태에서 다시 실행을 시키기 위해 준비상태처럼 만들어준다.

runOnUiThread(new Runnable() {

@Override

public void run()

{ } });

쓰레드 안에서 UI를 변경하기 위해서 사용한다.

메인액티비티 안에서만 사용이 가능하다.


안드로이드

Pattern pattern = Pattern.compile

("[a-zA-Z--]*$");

회원가입을 할 때 특수문자등의 입력을 제한한다. Pattern을 이용하여 SQL인젝션을 방지하였다.

 

 

 양재만.hwp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


+ Recent posts