2012-11-29 5 views
0

UDP 소켓을 통해 객체 (ClientModel)를 보내려고합니다. 간단한 문자열을 보내려고하면 소켓 부분이 잘 작동합니다. 예외가 발생했습니다. 오류는 어디에서 발생합니까? 클라이언트는 "클라이언트 : 실패"라고 말합니다. 문제가 송신 프로세스이기 때문에 여기에 코드는 클라이언트 측 미안, 나는이 물건 :안드로이드 UDP 소켓을 통해 객체 보내기

덕분에 여기

public class ClientActivity extends Activity { 
    public static final int SERVERPORT = 5050; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.client); 

     try { 
      InetAddress serverAddr = getBroadcastAddress(); 

      DatagramSocket socket = new DatagramSocket(); 

      //byte[] buf = "whatsup bitches".getBytes(); 

      ClientModel sendingMessage = new ClientModel(); 
      sendingMessage.data = 999; 
      sendingMessage.name = "sample"; 
      System.out.println(sendingMessage); 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ObjectOutputStream oos = new ObjectOutputStream(baos); 
      oos.writeObject(sendingMessage); 
      byte[] buf = baos.toByteArray(); 


      DatagramPacket packet = new DatagramPacket(buf, buf.length, 
      serverAddr, SERVERPORT); 
      socket.send(packet); 
      Log.d("UDP", "Client: Packet sent to server on address: " + serverAddr); 
     } 
     catch (Exception e) { 
      Log.d("UDP", "Client: Fail"); 
     } 
    } 

    private InetAddress getBroadcastAddress() throws IOException { 
     WifiManager myWifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
     DhcpInfo myDhcpInfo = myWifiManager.getDhcpInfo(); 
     if (myDhcpInfo == null) { 
      System.out.println("Could not get broadcast address"); 
      return null; 
     } 
     int broadcast = (myDhcpInfo.ipAddress & myDhcpInfo.netmask) 
        | ~myDhcpInfo.netmask; 
     byte[] quads = new byte[4]; 
     for (int k = 0; k < 4; k++) 
     quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); 
     return InetAddress.getByAddress(quads); 
    } 

    class ClientModel { 
     public int data; 
     public String name; 
    } 
} 

수신에 대해 생각 할 수있는 것보다, 순간, 로그 것입니다 :

11-29 17:10:09.933: I/System.out(5700): [email protected] 
11-29 17:10:09.964: W/System.err(5700): java.io.NotSerializableException: com.example.ClientActivity$ClientModel 
11-29 17:10:09.964: W/System.err(5700):  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535) 
11-29 17:10:09.964: W/System.err(5700):  at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847) 
11-29 17:10:09.964: W/System.err(5700):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689) 
11-29 17:10:09.964: W/System.err(5700):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653) 
11-29 17:10:09.964: W/System.err(5700):  at com.example.ClientActivity.onCreate(ClientActivity.java:39) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
11-29 17:10:09.964: W/System.err(5700):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-29 17:10:09.964: W/System.err(5700):  at android.os.Looper.loop(Looper.java:130) 
11-29 17:10:09.964: W/System.err(5700):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
11-29 17:10:09.964: W/System.err(5700):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-29 17:10:09.964: W/System.err(5700):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-29 17:10:09.964: W/System.err(5700):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 
11-29 17:10:09.964: W/System.err(5700):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
11-29 17:10:09.964: W/System.err(5700):  at dalvik.system.NativeStart.main(Native Method) 
11-29 17:10:09.964: D/UDP(5700): Client: Fail 
+1

, 당신은 더 많은 정보를 얻을 것 ... (힌트 :. 당신은 거의 * * 당신이 잡을 예외를 무시해서는 안) –

+0

스택 트레이스를 보여 주실 수 있습니까? 도움이 될 것입니다. – LuigiEdlCarno

+0

나는 그것을하는 법을 모르지만, 나는 며칠에서 안드로이드 프로그래밍을하고있다. – phcaze

답변

3

java에서 직렬화에 대해 자세히 알아야합니다. 당신이 실제로 대신 하드 코딩 된 메시지의 예외를 기록 어쩌면 경우

class ClientModel implements Serializable{ 
    public int data; 
    public String name; 
} 
+0

그것은 문제를 해결하지 못한다. 같은 오류가 발생합니다. 확실히 나는 java/android에 관해 더 많이 배워야 만한다. ( – phcaze

+0

"java.lang.ClientActivity"가 작동하는 메인 클래스에서 "implements Serializable"을 추가한다. 나는 UDP 패킷을 보낼 수있다, 많이 고마워야한다. – phcaze

0

UDP는 연결이 적으며 실제로 데이터를 100 % 얻을 수 없음을 잊지 마십시오. 체크 아웃 http://cs.nyu.edu/~bacon/phd-thesis/diss/node32.html

그래서 여기에 내가 무엇을 할 것입니다. 직렬화가 작동하는지 확인하고 객체를 메모리에서 직렬화 한 다음 메모리에서 비 직렬화하십시오. 그게 효과가 있다면 네트워크 문제를 안다.

네트워크 문제가있는 경우 TCP 기반 스트림으로 전환하고 해당 데이터를 전송하는 것이 좋습니다. 또한 데이터에 체크섬을 추가하여 제대로 도착하는지 확인할 수도 있습니다.

+0

그래, 이건 그냥 발견 단계에요, 내가 응용 프로그램에서 TCP를 사용하지만 순간에 나는 "안녕하세요"메시지를 방송해야하므로 UDP가 필요하다는 걸 알고있다 – phcaze

0
ByteArrayInputStream bais = new ByteArrayInputStream(packet.getData()); 
    ObjectInputStream ois = new ObjectInputStream(bais); 
    bais.close(); // move this to end of code 
    ois.close(); // move this to end of code 

    receivingMessage = (ClientModel) ois.readObject(); //you can't read if you've closed the streams 
+0

적어도 대답에 대한 설명을 포함시켜야한다. –

+0

설명 : 스트림을 닫은 경우 읽을 수 없습니다. – Chuck

관련 문제