Java - 通过UDP发送数据包

时间:2013-10-10 21:48:44

标签: java android sockets udp

在我的Android应用程序中,我通过UDP发送消息。我关注thisthis。 但是,我无法将初始数据包从客户端发送到服务器。如果我在下面的代码中做错了,请告诉我:

class serverCommunicationThread implements Runnable 
{
    public void run() 
    {
        try {
            serverSocket = new DatagramSocket(STATICPORT);
            ServerReceiveMessageThread rcvMsgThread = new ServerReceiveMessageThread(serverSocket);
            new Thread(rcvMsgThread).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

这是ServerReceiveMessageThread类:

class ServerReceiveMessageThread implements Runnable
{
    DatagramSocket clientSocket;
    byte[] buffer = new byte[108];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

    ServerReceiveMessageThread(DatagramSocket clientSocket)
    {
        this.clientSocket = clientSocket;
    }

    @Override
    public void run() 
    {
        int counter = 0;
        MsgStruct recvMsgStruct = null;

        try {
            ByteArrayOutputStream baosServer = new ByteArrayOutputStream();
            serializeServer = new ObjectOutputStream(baosServer);

            clientSocket.receive(packet);
            ByteArrayInputStream baosRecv = new ByteArrayInputStream(buffer);
            deserializeServer = new ObjectInputStream(baosRecv);

            while(true)
            {
                try {
                    recvMsgStruct = (MsgStruct) deserializeServer.readObject();
                } catch (ClassNotFoundException e1) {
                    e1.printStackTrace();
                }
                boolean retVal = serverSendMessage(clientSocket, recvMsgStruct, baosServer.toByteArray());
        } catch (IOException e2) {
            e2.printStackTrace();
        }
   }
}

serverSendMessage方法:

public boolean serverSendMessage(DatagramSocket clientSocket, MsgStruct msgStruct, byte[] buf)
{
        MsgStruct recvMsgStruct = new MsgStruct();
        recvMsgStruct.pingPong = true;
        recvMsgStruct.msgId = msgStruct.msgId;
        recvMsgStruct.bufferMsg = msgStruct.bufferMsg;

        try {
            serializeServer.writeObject(recvMsgStruct);
            serializeServer.flush();
            DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(mobileIP), STATICPORT);
            clientSocket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
}

客户端发送/接收的代码类似于服务器的代码。我在这里得到一个NullPointerException。

serializeClient.writeObject(mobileSendMsgStruct);

public boolean mobileSendMessage(int msgId)
{
    MsgStruct mobileSendMsgStruct = new MsgStruct();
    mobileSendMsgStruct.bufferMsg = new byte[100];

        mobileSendMsgStruct.pingPong = false;
        mobileSendMsgStruct.msgId = msgId;
        rand.nextBytes(mobileSendMsgStruct.bufferMsg);
        try {
            sendTime = System.nanoTime();
            serializeClient.writeObject(mobileSendMsgStruct); /*I get a NullPointerException here*/
            serializeClient.flush();
            byte[] sendBuf = baosSend.toByteArray();
            DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, InetAddress.getByName(staticIP), STATICPORT);
            mobileSocket.send(packet);
            outPing.write(Long.toString(sendTime) + ", " + String.valueOf(mobileSendMsgStruct.msgId) + ", " + String.valueOf(mobileSendMsgStruct.bufferMsg) + " | ");
        } catch (IOException e1) {
            e1.printStackTrace();
            return false;
        } 
        return true;
}

0 个答案:

没有答案