0

UDPソケットを介してオブジェクト(ClientModel)を送信しようとしています。単純な文字列を送信しようとすると機能するため、ソケット部分は正常に機能します。例外が発生しましたが、エラーはどこにありますか?クライアントは「クライアント:失敗」と言います。これがコードです。問題は送信プロセスであるため、現時点ではクライアント側のみです。これは、このようなものの受信について考えることができます:)

ありがとう

    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): com.example.ClientActivity$ClientModel@4054b800
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
4

3 に答える 3

3

Javaでのシリアル化についてもっと学ぶ必要があります。

class ClientModel implements Serializable{
    public int data;
    public String name;
}
于 2012-11-29T16:23:36.817 に答える
0

UDPはコネクションレス型であり、実際には100%の時間データを取得しないことを忘れないでください。http://cs.nyu.edu/~bacon/phd-thesis/diss/node32.htmlをチェックしてください

これが私がすることです。シリアル化が機能していることを確認しますが、オブジェクトをメモリ内でシリアル化してから、メモリから逆シリアル化します。それが機能する場合は、ネットワークの問題を知っています。

ネットワークに問題がある場合は、TCPベースのストリームに切り替えて、そのデータをその方法で送信してみてください。また、データが正しく到着することを確認するために、データにチェックサムを追加することもできます。

于 2012-11-29T16:10:08.620 に答える
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
于 2013-03-08T20:43:29.337 に答える