嘿伙计们,我一直在尝试制作NIO服务器/客户端程序。 我的问题是服务器只发送14个字节,然后它不再发送任何东西。我已经坐了这么久,以至于我再也看不到任何东西了,所以决定看看这里有人能看到问题吗
服务器代码:
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class Testserver {
public static void main(String[] args) throws java.io.IOException {
ServerSocketChannel server = ServerSocketChannel.open();
server.socket().bind(new java.net.InetSocketAddress(8888));
for(;;) {
// Wait for a client to connect
SocketChannel client = server.accept();
String file = ("C:\\ftp\\pic.png");
ByteBuffer buf = ByteBuffer.allocate(1024);
while(client.read(buf) != -1){
buf.clear();
buf.put(file.getBytes());
buf.flip();
client.write(buf);
// Disconnect from the client
}
client.close();
}
}
}
客户端:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.WritableByteChannel;
import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class Testclient {
public static void main(String[] args) throws IOException {
SocketChannel socket = SocketChannel.open(new InetSocketAddress(8888));
FileOutputStream out = new FileOutputStream("C:\\taemot\\picNIO.png");
FileChannel file = out.getChannel();
ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
while(socket.read(buffer) != -1) {
buffer.flip();
file.write(buffer);
buffer.compact();
buffer.clear();
}
socket.close();
file.close();
out.close();
}
}
答案 0 :(得分:0)
您只发送文件名,而不是文件内容。文件名是14个字节。
每次客户端发送任何内容时,您都会发送该消息。然而,客户端永远不会发送任何东西,所以我很惊讶你甚至得到了14个字节。
你忽略了write()的结果。
如果要发送文件内容,请使用FileChannel打开它。同样,使用FileChannel在客户端中打开目标文件。然后两个地方的复制循环是相同的。在通道之间复制缓冲区的正确方法如下:
while (in.read(buffer) >= 0 || buffer.position() > 0)
{
buffer.flip();
out.write(buffer);
buffer.compact();
}
请注意,这会在读取EOS后处理部分读取,部分写入和最终写入。
说了这么多,我认为没有任何理由在这里使用NIO。使用java.net套接字和java.io流会更加简单。