如何使用Java中的objectinputstream从服务器多次读取文件
如何在服务器上多次读取文件?这个代码应该工作吗?它不会在第一次循环检查中卡住吗 服务器正在像这样将其写入客户端如何使用Java中的objectinputstream从服务器多次读取文件,java,sockets,networking,file-io,Java,Sockets,Networking,File Io,如何在服务器上多次读取文件?这个代码应该工作吗?它不会在第一次循环检查中卡住吗 服务器正在像这样将其写入客户端 ObjectOutputStream oos = new ObjectOutputStream(c.getOutputStream()); ObjectInputStream ois = new ObjectInputStream(c.getInputStream()); File
ObjectOutputStream oos = new ObjectOutputStream(c.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(c.getInputStream());
File file = new File("lol.txt");
if(!file.exists()){
file.createNewFile();
}
byte[] textBytes;
while((textBytes = (byte[])ois.readObject()) != null){
Files.write(file.toPath(), textBytes);
}
//do stuff...
byte[] textBytes;
while((textBytes = (byte[])ois.readObject()) != null){
Files.write(file.toPath(), textBytes);
}
不可能对套接字的
InputStream
进行可重复读取,因为它是基于缓冲区的阻塞实现,使用描述符来指示缓冲区中的当前位置
当您从InputStream
读取时,描述符将移动您已读取的字节数。无法将描述符
倒回上一个位置,因为读取的字节可能已被新接收的字节覆盖
服务器-客户端通信必须以这种方式进行
(我使用以下缩写:S->a Server,C->a Client):
不可能对套接字的InputStream
进行可重复读取,因为它是基于缓冲区的阻塞实现,使用描述符来指示缓冲区中的当前位置
当您从InputStream
读取时,描述符将移动您已读取的字节数。无法将描述符
倒回上一个位置,因为读取的字节可能已被新接收的字节覆盖
服务器-客户端通信必须以这种方式进行
(我使用以下缩写:S->a Server,C->a Client):
c是java.net.Socket
的实例吗?并且oos是连接到服务器套接字的ObjectOutputStream
吗?是的,c是java.net.socket的实例,oos是连接到服务器的。注意,您的读取循环无效readObject()
在流的末尾不返回null。它可以在任何时候编写null。您需要捕获EOFEException
。c是java.net.Socket
的实例吗?并且oos是连接到服务器套接字的ObjectOutputStream
吗?是的,c是java.net.socket的实例,oos是连接到服务器的。注意,您的读取循环无效readObject()
在流的末尾不返回null。它可以在任何时候编写null。您需要捕获EOFEException
。
byte[] fileBytes = Files.readAllBytes(fp.toPath());
oos.writeObject(fileBytes);
oos.flush();
C: Request file from S
S: Send file to C
C: Request file from S
S: Send file to C
(and so on)