Java Android通过UDP套接字发送对象

Java Android通过UDP套接字发送对象,java,android,sockets,udp,bytearrayoutputstream,Java,Android,Sockets,Udp,Bytearrayoutputstream,我试图通过UDP套接字发送一个对象(ClientModel)。套接字部分工作正常,因为如果我尝试发送一个简单的字符串,它就会工作。我遇到一个异常,错误在哪里?客户说“客户:失败”。下面是代码,目前只有客户端,因为问题是发送过程,所以我可以考虑接收以下内容:) 谢谢 public class ClientActivity extends Activity { public static final int SERVERPORT = 5050; public void on

我试图通过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;
    }
}

不要忘记UDP连接较少,在实际操作中不会100%获得数据。退房

这就是我要做的。验证序列化是否正常工作,但在内存中序列化对象,然后从内存中反序列化。如果这样做有效,你就知道这是一个网络问题


如果是网络问题,您可以尝试切换到基于TCP的流,并以这种方式发送数据。此外,您可能希望向数据添加校验和,以确保数据正确到达。

不要忘记UDP连接较少,在实际操作中不会100%获得数据。退房

这就是我要做的。验证序列化是否正常工作,但在内存中序列化对象,然后从内存中反序列化。如果这样做有效,你就知道这是一个网络问题


如果是网络问题,您可以尝试切换到基于TCP的流,并以这种方式发送数据。此外,您可能需要向数据中添加校验和,以确保数据正确到达。

您需要了解有关java序列化的更多信息

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

您需要进一步了解java中的序列化

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

也许如果你真的记录了异常而不是硬编码的消息,你会得到更多的信息。。。(提示:你几乎不应该忽略你捕获的异常。)你能给我们看看stacktrace吗?那会有帮助的。我不知道怎么做,几天后我就开始为android编程了:)Log.d(“UDP”,e.printStackTrace());也许如果你真的记录了异常而不是硬编码的消息,你会得到更多的信息。。。(提示:你几乎不应该忽略你捕获的异常。)你能给我们看看stacktrace吗?那会有帮助的。我不知道怎么做,几天后我就开始为android编程了:)Log.d(“UDP”,e.printStackTrace());这并不能解决问题,我还是会犯同样的错误。当然,我还需要学习更多关于java/android的知识:(在主类ClientActivity中添加“implements Serializable”!我可以发送UDP数据包,非常感谢!这并不能解决问题,我仍然会遇到同样的错误。当然,我还需要学习更多关于java/android的知识:(添加“implements Serializable”在主类ClientActivity中,它也起作用了!我可以发送UDP数据包,非常感谢!是的,我知道,这只是一个发现阶段,我将在应用程序中使用TCP,但目前我必须发送广播“你好”消息,所以我需要UDPYeah我知道,这只是一个发现阶段,我将在应用程序中使用TCP,但目前我必须发送广播“hello”消息,所以我需要UDPYou至少包括您答案的解释。您至少应该包括您答案的解释。
    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