UDP客户端/服务器对象传输帮助

时间:2011-07-19 13:45:57

标签: java sockets udp

我正在尝试使用UDP协议将ArrayList从客户端传输到服务器。

传输从“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 个答案:

答案 0 :(得分:1)

您的代码会创建很多立即丢弃的数组。我会使用调试器来逐步执行代码,以便您了解它正在做什么。

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中。最后你丢弃第二个数组并用第一个数组的副本替换它。

相关问题