我试图了解错误在哪里没有成功。 该场景是连接到接收文件的服务器的客户端,一种“上传”。然后服务器打开FileChannel,读取所有数据并将其存储在复制到本地文件的缓冲区中。
服务器
ServerSocketChannel ssf = ...//[Initialized into the costrutor]
SocketChannel clientf = null;
Path path = Paths.get(new File("").getAbsolutePath()+"/"+"example.txt");
try {
// Creating file to write
FileChannel file = FileChannel.open(path, EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE));
clientf = ssf.accept();
System.out.println("Client is connected");
ByteBuffer buffer = ByteBuffer.allocate(1024);
int i=0;
//Here I'll read the data sent from the client
while (clientf.read(buffer) > 0) { //LOOP1
buffer.flip();
while (buffer.hasRemaining()) { //LOOP2
file.write(buffer);
}
buffer.clear();
i++; // Used in order to know how many iteration are performed
}
file.close();
System.out.println("File received");
} catch(IOException e){
e.printStackTrace();
}
finally {
// CLose all the open connections
if(ssf != null) {
try {
if(clientf != null)
clientf.close();
ssf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
byte[] message = new byte[x];
in.readFully(message, 0, message.length);
try {
SocketChannel sockfile = SocketChannel.open();
//sockfile.configureBlocking(false); //If this line is executed the client doesn't connect. Why?
sockfile.connect(new InetSocketAddress(ip, portfile));
File f = new File("");
f = new File(f.getAbsoluteFile()+"/"+file);
RandomAccessFile af = new RandomAccessFile(f,"r");
FileChannel inCh = af.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (inCh.read(buffer) > 0) {
buffer.flip();
while(buffer.hasRemaining()) {
sockfile.write(buffer);
}
buffer.clear();
}
af.close();
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("File sent");
客户端终止是流程,因为它打印File sent
。相反,服务器不会退出LOOP1。我不明白为什么loop1 guard中的read()总是读取1024个字节(这个值来自调试),即使客户端关闭了通道(事实上它终止了所有流程)。
有什么想法吗?
答案 0 :(得分:1)
编写此复制循环的正确方法如下:
while (in.read(buffer) >= 0 || buffer.position() > 0)
{
buffer.flip();
out.write(buffer);
buffer.compact();
}
如果从套接字通道读取的一侧从不退出此循环,则对等方尚未关闭连接。