Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 ObjectInputStream给出奇怪的结果_Java_Network Programming - Fatal编程技术网

Java ObjectInputStream给出奇怪的结果

Java ObjectInputStream给出奇怪的结果,java,network-programming,Java,Network Programming,这是我正在使用的代码 客户: public static void main(String[] args) throws IOException { Socket socket = new Socket("0.0.0.0", 5555); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); FileInputStream in = new FileInputStream("C

这是我正在使用的代码

客户:

public static void main(String[] args) throws IOException {
    Socket socket = new Socket("0.0.0.0", 5555);
    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
    FileInputStream in = new FileInputStream("C:/Documents and Settings/Owner/Desktop/Client/README.txt");
    byte[] b = new byte[1024];
    int i = 0;
    i = in.read(b);
    out.writeInt(i);
    out.write(b, 0, i);
    out.flush();
    i = in.read(b);
    out.writeInt(i);
    out.write(b, 0, i);
    out.flush();
    out.close();
    in.close();
    socket.close();
}
服务器:

public static void main(String[] args) throws IOException {
    ServerSocket ss = new ServerSocket(5555);
    Socket s = ss.accept();
    ObjectInputStream in = new ObjectInputStream(s.getInputStream());
    FileOutputStream fos = new FileOutputStream("C:/README.txt");
    int i = 0;
    i = in.readInt();
    System.out.println(i);
    byte[] bytes = new byte[i];
    in.read(bytes);
    i = in.readInt();
    System.out.println(i);
    byte[] bytes2 = new byte[i];
    in.read(bytes2);
    fos.write(bytes);
    fos.close();
    s.close();
    ss.close();
}
文件README.txt中有大约2400个字节。当我运行这个时,服务器输出这个

1024

1869488225

然后抛出java.lang.OutOfMemoryError

谁能告诉我为什么它的读数是1869488225而不是1024

谢谢

这里忽略read的返回值,并假设它填充了缓冲区。您应该在此处将
read()
更改为
readFully()
,但一般来说,您不应该忽略
read()
结果。它可以是-1表示EOS,也可以是从1到缓冲区大小的任意计数。如果无意中指定了长度为零的缓冲区,它甚至可以为零


这里忽略read的返回值,并假设它填充了缓冲区。您应该在此处将
read()
更改为
readFully()
,但一般来说,您不应该忽略
read()
结果。它可以是-1表示EOS,也可以是从1到缓冲区大小的任意计数。如果您无意中指定了一个零长度缓冲区,它甚至可以是零。

为什么要读取两次数据?@Jeffrey它发送两个不同的1024字节的块。是的,但是如果
README.txt
中有2400字节的文本,2400-2048=352字节的未发送数据。您应该使用循环发送您的数据块data@Jeffrey这就是我所做的,我遇到了这个问题。这个代码不是我正在使用的代码,这是一个孤立的问题。啊,只是确定一下。您正在从服务器端读取多少字节的数据?有可能您在数组中读取的字节数少于1024个,而
readInt
被流中剩余的额外字节弄糊涂了。您为什么要尝试读取两次数据?@Jeffrey它正在发送两个不同的1024字节块。是的,但是如果
README.txt
中有2400字节的文本,2400-2048=352字节的未发送数据。您应该使用循环发送您的数据块data@Jeffrey这就是我所做的,我遇到了这个问题。这个代码不是我正在使用的代码,这是一个孤立的问题。啊,只是确定一下。您正在从服务器端读取多少字节的数据?有可能您在数组中读取的字节少于1024个,而
readInt
被流中剩余的额外字节弄糊涂了。
in.read(bytes);
in.read(bytes2);