Справка по передаче объекта UDP клиент / сервер - PullRequest
0 голосов
/ 19 июля 2011

Я пытаюсь передать ArrayList с клиента на сервер по протоколу UDP.

Передача начинается с оператора "max" if.То же самое на стороне сервера

Это клиент:

public class UdpClient {
protected DatagramPacket sendPacket;
protected DatagramPacket receivePacket;

public static void main(String args[]) throws IOException,
        ClassNotFoundException {
    UdpClient upd = new UdpClient();
    ArrayList<Integer> arr = new ArrayList<Integer>();
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
            System.in));
    DatagramSocket clientSocket = new DatagramSocket();
    byte[] sendData = new byte[1024];
    byte[] receiveData = new byte[1024];
    ByteArrayOutputStream bStream = new ByteArrayOutputStream();
    ObjectOutput oo = new ObjectOutputStream(bStream);
    ByteArrayInputStream baos;
    ObjectInputStream oos;
    System.out
            .println("Commands: Time, Date, Weather, Sum-number, Max-number, Exit");
    while (true) {
        String fromUsr = inFromUser.readLine();
        if (fromUsr.equals("bye")) {
            break;
        } else if (fromUsr.equals("weather")) {
            sendData = fromUsr.getBytes();
            upd.sendPacket(sendData, clientSocket);
            System.out
                    .println("Please select a ctiy: Lund, Malmo, Stockholm");
            String weather = inFromUser.readLine();
            sendData = weather.getBytes();
            upd.sendPacket(sendData, clientSocket);
            upd.receivePacket(clientSocket, receiveData);
        } else if (fromUsr.equals("max")) {
            sendData = fromUsr.getBytes();
            upd.sendPacket(sendData, clientSocket);
            String max = inFromUser.readLine().trim();
            upd.nums(max, arr);
            oo.writeObject(arr);
            byte[] buf = new byte[bStream.toByteArray().length];
            buf = bStream.toByteArray();
            upd.sendPacket(buf, clientSocket);
            System.out.println(arr);
        } else {
            // send data that of the user
            sendData = fromUsr.getBytes();
            upd.sendPacket(sendData, clientSocket);
            upd.receivePacket(clientSocket, receiveData);
        }
        String fromServer = new String(upd.getData());
        System.out.println("Message from server:\n" + fromServer);
    }
}

private void sendPacket(byte[] sendData, DatagramSocket clientSocket)
        throws IOException {
    InetAddress IPAddress = InetAddress.getByName("ericman-PC");
    sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress,
            9876);
    clientSocket.send(sendPacket);

}

private void receivePacket(DatagramSocket serverSocket, byte[] receiveData)
        throws IOException {
    byte[] rData = new byte[1024];
    receiveData = rData;
    receivePacket = new DatagramPacket(receiveData, receiveData.length);
    serverSocket.receive(receivePacket);
}

Это сервер

    public class UdpServer {
protected DatagramPacket receivePacket;
protected DatagramPacket sendPacket;

public static void main(String args[]) throws IOException,
        ClassNotFoundException {
    UdpServer upd = new UdpServer();
    DatagramSocket serverSocket = new DatagramSocket(9876);
    DateFormat currentDate = new SimpleDateFormat("yyyy/MM/dd");
    DateFormat currentTime = new SimpleDateFormat("HH:mm:ss");
    Date date = new Date();
    ByteArrayInputStream baos;
    ObjectInputStream oos;
    byte[] sendData = new byte[1024];
    byte[] receiveData = new byte[1024];

    while (true) {
        System.out.println("****************************************"
                + "\nServer is connected");
        upd.receivePacket(serverSocket, receiveData);
        String str = new String(upd.getData()).trim();
        System.out.println("Message received is:" + " " + str);
        if (str.equals("time")) {
            str = currentTime.format(date);
            sendData = str.getBytes();
            upd.sendPacket(serverSocket, sendData);
        } else if (str.equals("date")) {
            str = currentDate.format(date);
            sendData = str.getBytes();
            upd.sendPacket(serverSocket, sendData);
        } else if (str.equals("weather")) {
            upd.receivePacket(serverSocket, receiveData);
            str = upd.weather(str = new String(upd.getData()).trim());
            sendData = str.getBytes();
            upd.sendPacket(serverSocket, sendData);

        } else if (str.equals("max")) {
            byte[] buf = new byte[1024];
            System.out.println("waitng for object to come");
            upd.receivePacket(serverSocket, buf);
            baos = new ByteArrayInputStream(buf);
            oos = new ObjectInputStream(baos);
            Object o = oos.readObject();
            System.out.println(o);
        } else {
            str = "Unknown command, please try again..";
            sendData = str.getBytes();
            upd.sendPacket(serverSocket, sendData);
        }

    }
}

Это ошибка, которую я получаю на стороне сервера

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 00000000
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at UdpServer.main(UdpServer.java:54)

В строке 54, на которой указана ошибка, указана эта строка на сервере

baos = new ByteArrayInputStream(buf);
            oos = new ObjectInputStream(baos);

Если вы не могли бы помочь мне выяснить, почему возникает эта ошибка?спасибо!

1 Ответ

1 голос
/ 19 июля 2011

Ваш код создает множество массивов, которые он немедленно отбрасывает. Я бы использовал отладчик для пошагового выполнения кода, чтобы вы понимали, что он делает.

private void receivePacket(DatagramSocket serverSocket, byte[] receiveData)
        throws IOException {
    // create a new array
    byte[] rData = new byte[1024];
    // throw away the orignal array so the new array will be update.
    receiveData = rData;
    // copy into the new array, not the old one.
    receivePacket = new DatagramPacket(receiveData, receiveData.length);
    serverSocket.receive(receivePacket);
}

В этом случае исходный receiveData не будет изменен, поэтому он будет содержать много 0 байтов.


        byte[] buf = new byte[bStream.toByteArray().length];
        buf = bStream.toByteArray();

Это создает три массива, когда все, что вам нужно, это один. Первый массив bStream.toByteArray() создается только для того, чтобы вы могли определить, какой длины он будет. Вы создаете второй массив такой же длины, но пустой, и помещаете его в buf Наконец, вы отбрасываете второй массив и заменяете его копией первого массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...