티스토리 뷰

서버 클라이언트 통신

서버-클라이언트 통신시 소켓을 사용하게 되는데, Input/OutputStream으로는 int나 byte데이터만 전달할 수 있다. 이때 클래스등의 데이터를 전달하려면 ObjectInput/OutputStream을 사용하면 간단하게 데이터를 주고 받을 수 있다.

이전에 사용했던 안드로이드의 Parcel과 비슷하다(애초에 이쪽이 자바 쪽 기능을 가져온거겠지...)

먼저, 전달할 클래스를 직렬화 해야 하는데 Serializable 혹은 Externalizable을 implement 한다. 둘 다 같은 기능을 하고, Externalizable는 데이터를 어떻게 전달할 지 명시적으로 지정하고 싶을 때 사용한다. 이때엔 read/writeExternal 메소드를 오버라이드 해서 직접 read/write해야 한다.

그리고 반드시 매개변수 없는 생성자를 public으로 명시해야 한다. 그렇지 않으면 생성자 없다고 오류를 내뱉는다. 생성자의 내용은 비어있어도 상관없다. 있기만 하면 된다.

데이터를 보낼 때는 소켓으로 ObjectOutputStream을 만들어서 writeObject메소드로 전달하고, 받을 때도 마찬가지로 readObject메소드로 읽어오면 된다.(primitive한 자료형 이외에는 read/writeObject 메소드를 사용하면 된다.)

여기서는 전체내용을 담을 Package 클래스를 하나 만들고, 멤버변수로 그 안에 내용물의 종류(int 타입)와 내용물(Object 타입)을 지정한 후 보내도록 하였다. 받는 쪽에서는 내용물의 종류에 따라 내용물을 캐스팅하여 사용하면 된다.

마치 택배를 보낼 때, 택배상자(Package클래스)를 하나 구해서 쪽지(int타입)랑 내용물(Object타입)을 넣고 보내는 것으로 생각할 수 있다.(물론 사람은 내용물이 뭔지 한눈에 알 수 있지만 컴퓨터는…)

이렇게 하면 전달할 때 마다 readObject와 writeObject를 딱 한번씩만 하면 된다.(괜히 EOFExecption이 나올 이유가 없다.)


MySQL과 SQLite의 차이

간단하게 서버를 제작하여 어플과 연동테스트를 하고 있다. 
생각보다 서버-클라이언트간 통신할 때 챙겨줘야 할 것들이 많다.

스트림을 중복으로 열지는 않았는지, 데이터를 주고 받을 때 같은 데이터 타입으로 주고 있는지….

그리고 안드로이드의 sqlite와 자바에서 쓰고 있는 MySQL간에 차이가 생각보다 많이 나서 헤메고 있다. 
(컬럼의 시작이 sqlite는 0이고 MySQL은 1이다.) 
또 어디서 되는 기능은 어디서 안되고 하는 경우도 많다. 
(MySQL에서는 ResultSet의 크기를 구하는 메소드가 없다;;;; Shock and owe!)

또 article 클래스의 경우에는 android에서 activity간 통신을 목적으로 Parcelable을 implements하였기 때문에 통신용으로 commArticle을 따로 만들고, 서버와 주고 받을 때 마다 article<->commArticle사이를 변환해야 한다.

내부 네트워크 상에서는 통신이 잘 되는 편인 것 같다. 3G를 통하면 또 다르겠지만.

우선은 텍스트 데이터들만 주고 받도록 해야겠다.



Location.distanceBetween()


안드로이드에서 두 점 사이의 거리를 구하려면, location의 distanceTo나 distanceBetween메소드를 사용하면 된다.

그러나 안드로이드 이외에서 구하려면 어떻게 해야 할까? 간단한 수학을 이용해보자.

가장 간단한 방법으로 sqrt((x2-x1)^2 + (y2-y1)^2) 공식을 이용해볼 수 있다. 
그러나 지구는 둥그니까 거리가 멀어지면 멀어질 수록 오차가 크게 발생한다.

다음으로 생각해 볼 것은 지구를 r=6400km짜리 구로 본다면 각 AOB를 마주보는 호AB의 길이를 구하면 된다.

호AB = rΘ, Θ각도는 각AOB이므로, 내적 A · B = |A||B|cosΘ 
내적을 구하려면 먼저 직각좌표계로 변환해야 한다.

x = cos(Latitude) * cos(Longitude) 
y = cos(Latitude) * sin(Longitude) 
z = sin(Latitude)

좌표값 Latitude, Longitude는 degree이므로 계산시 radian으로 변환해야 한다.(pi/180을 곱한다.)

A · B를 |A||B|로 나누고 계산하면

Θ = arccos(x1*x2 + y1*y2 + z1*z2)

Θ에 지구반지름을 곱하면 거리가 나오겠다.

하지만 지구는 완전한 구가 아니라 타원체이므로 오차가 발생하게 된다. 
좀더 세밀한 계산을 하려면 국토지리원에서 제공하는 자료를 이용하면 된다. 링크

하지만 여기서는 세밀한 계산은 필요 없으므로 이 정도면 충분할 것 같다.

'학교 > 졸업작품' 카테고리의 다른 글

코드 리팩토링  (0) 2011.08.30
다른 액티비티로 메시지 전송 (2)  (0) 2011.08.23
ListView 및 Gallery의 사용  (0) 2011.08.22
액티비티 관련 내용(데이터 전송, 전환 등)  (0) 2011.08.22
날씨 업데이트 과정  (0) 2011.08.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함