소켓통신쪽에 공부를 하는데
간단한 숫자나 string값을 넘기는거 까진 성공했습니다.
근데 제가 안드로이드 폰에서 넘겨야 할 값은 3가지로
핸드폰 번호, 위도 경도를 넘겨야 하는데...
한꺼번에 이 정보 3개를 넘기기 위해 클래스를 하나 지정하고
넘기려 했는데..
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.example.gps_client.info라고
에러메세지가 뜨네요
대충 검색해보니 직렬화 해야한다는데..무슨말인지도 모르겠고..ㅠ
좀 도아주세요 ㅠ 소스 코드 붙입니다 ㅠ
이건 info부분입니다.
public class info {
String P_number;//전화번호
double Latitude;//위도
double Longitude;//경도
......
}
이 부분은 서버 부분입니다.
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class test_server {
public static void main(String args[])
{
info result=new info ();
int port = 8021;
try {
ServerSocket mysocket = new ServerSocket(port);
System.out.println("socket make success..");
while (true)
{
Socket c_sock = mysocket.accept();
System.out.println("client socket..");
InetAddress clienthost = c_sock.getLocalAddress();
int clientport = c_sock.getPort();
System.out.println("연결된 클라이언트 ->" + "Ip : "+clienthost+", port : "+ clientport);
ObjectInputStream out = new ObjectInputStream(c_sock.getInputStream());
result = (info)out.readObject();
System.out.println("번호 : "+result.get_number()+" 좌표 : "+result.get_Latitude()+" "+ result.get_Longitude());
}
}
catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e);
}
}
}
이부분은 클라이언트 부분입니다.(버튼 클릭시 소켓통신활성화 하여 보내는 부분)
conn.setOnClickListener(new View.OnClickListener() { @SuppressLint("NewApi") public void onClick(View v) { info infomation =new info (); infomation.set_number(myNumber); infomation.set_Latitude(T_Latitude); infomation.set_Longitude(T_Longitude); //이 아래 2줄은 안드로이드 소켓 통신이 접속 가능하도록 만들어주는 기능으로, 2.2버전 이상의 안드로이드는 필요한 기능이다. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build()); ///////////////////////////////////////////////////////////////////////////// try { Socket socket = new Socket("192.168.1.145",8021); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); out.writeObject(infomation); out.flush(); } catch (Exception e) { // TODO Auto-generated catch block String a = e.toString(); AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this); alert.setPositiveButton("확인", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //닫기 } }); alert.setMessage(a); alert.show(); } } }); }
초보자라 직렬 연결 이런걸 잘 모르네요 ㅠ
답변좀 부탁드리겠습니다 ㅠ
List는 interface구요 그걸 구현한 클래스들은 Serializable이라는 인터페이스를 구현하고있습니다.
직렬화가 가능한 객체는 저 Serializable 인터페이스가 구현되어있는 객체밖에 안됩니다.
그래서 List는 보낼수가 있었던 겁니다.
님께서 생성한 Stream으로 보내고자 하는 클래스에 implements Serializable을 해보세요.
public class info implements Serializable <-- 이런식으로
그리고 왠만하면 class명의 첫글자는 대문자로, 변수명의 첫글자는 소문자로 해주세요..
명명규칙은 여러 사람과 개발을 진행할시에 서로 코드에대한 이해도나 가독성을 높여줍니다.
직렬화 라는것은 객체를 순서대로 배치시켜버린다는 의미라고 생각하세요. (실제로 조금 다릅니다만..)
객체안에 변수가 3개가 있다면 그 변수 3개에는 순서가 있을까요?
없습니다. 순서뒤죽박죽인 상태로 다른 곳으로 보낸다면 받는 쪽에서 그걸가지고 뭐가 어떤 변수의 값인지 알수 있을까요?
그걸 방지하고자 Serialize를 시키는 겁니다. 변수의 순서대로 값이 써지도록 말이죠.
다른 방법으로는 객체에 있는 값을 그냥 문장열로 붙여서 보내는 방법이 있겠네요.
String value = P_number + "|" + Latitude + "|" + Longitude;
이렇게 붙여서 보내고 "|"으로 나눠서 값을 하거나
json형식으로 문자를 만들어서 보내고 받고 해도 좋겠네요.