Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP客户端/服务器对象传输帮助_Java_Sockets_Udp - Fatal编程技术网

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

Java UDP客户端/服务器对象传输帮助,java,sockets,udp,Java,Sockets,Udp,我正在尝试使用UDP协议将ArrayList从客户端传输到服务器 传输从“max”if语句开始。 服务器端也一样 这是客户: public class UdpClient { protected DatagramPacket sendPacket; protected DatagramPacket receivePacket; public static void main(String args[]) throws IOException, ClassNotFoundExce

我正在尝试使用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);
}
这就是我在服务器端遇到的错误

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)

如果你能帮我解决为什么会发生这个错误?塔克斯

您的代码会创建大量数组,并立即丢弃。我将使用调试器逐步完成代码,以便您了解它在做什么

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
字节



这将创建三个阵列,而您只需要一个阵列。创建第一个数组
bStream.toByteArray()
,只是为了确定它的长度。创建长度相同但为空的第二个数组,并将其放入
buf
最后丢弃第二个数组,并将其替换为第一个数组的副本。

如果数据很容易超过1024字节,则读取前1024字节是正确的。
private void receivePacket(DatagramSocket serverSocket,byte[]receiveData)抛出IOException{//创建一个新数组字节[]rData=新字节[1024];//丢弃原始数组以便更新新数组。receiveData=rData;//复制到新数组,而不是旧数组。receivePacket=新DatagramPacket(receiveData,receiveData.length);serverSocket.receive(接收数据包);}
我就是这样做的,因为如果我一次又一次地使用该方法,它会保留以前接收到的部分字节。您是否建议使用其他方法,以使接收字节的方法始终保持为空,从而不包含以前的字节?为什么包含以前的字节很重要?Java是按值传递的,因此您无法更改ge呼叫者引用。例如,如果在第一个命令中我询问时间,服务器会向我发送时间,然后如果我询问天气,该字节仍然包含一些时间数字,这取决于天气信息的大小,在我的情况下,天气信息是晴朗的。这就是我所做的,因此每次我从服务器我的缓冲区是空的。所以如果我没有这样做,我会从我以前的请求中得到打印的信息
baos = new ByteArrayInputStream(buf);
            oos = new ObjectInputStream(baos);
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);
}
        byte[] buf = new byte[bStream.toByteArray().length];
        buf = bStream.toByteArray();