我正在尝试编写一个java程序,使用Sockets
通过网络将文件从一个设备传输到另一个设备。所以我有两个类,Server
和Client
来处理程序IO。我正在使用FileInputStream
将本地文件的字节读入Client
和Socket的OutputStream
以将读取的字节发送到Server
。这是
class Client
的代码段:
int read;
System.out.print("Enter name of file to send : ");
String fileName = br.readLine();
File file = new File(fileName);
if(!file.exists()) {
LISTENER.log(fileName + "does not exists."); // Exception Logging
throw new IOException("File not found : " + fileName);
}
String parts[] = fileName.split("\\.");
String ext = parts[parts.length-1]; // Extracts the file extension
PrintWriter pw = new PrintWriter(sock.getOutputStream());
InputStream is = new FileInputStream(file);
pw.println(ext); // Sends file extension to the socket output stream
pw.flush();
while((read = is.read()) != -1) {
os.write(read); // Sends read bytes to the socket output stream
os.flush();
}
解释:所以我在这里尝试获取文件名并创建一个File对象file
。 String ext
提取文件扩展名并将其发送到Server
到PrintWriter
(以便在接收方端,它可以创建已知扩展名的文件)。之后,InputStream is
读取文件字节而不将其缓冲到class Client
(for better performance),直接通过套接字OutputStream os
发送读取的字节。
class Server
的代码段:
String ext; int read;
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
InputStream is = socket.getInputStream();
while(running) {
ext = br.readLine(); // reads the file extension sent from client
if(ext == null)
throw new NullPointerException("File name provided does not have any specified extention");
broadcast(ext); // sends the file extension back to all clients
while((read = is.read()) != -1) {
broadcast(read); // sends the read bytes to all clients
}
}
解释:此处,Socket的InputStream Reader
读取第一行,其中包含Client
通过PrintWriter
传递的文件扩展名。
broadcast(String)
方法用于通过Client
将扩展程序发送回所有PrintWriter
实施。然后,Socket的InputStream is
read()
方法读取File的字节,直到它返回-1(流结束)。 broadcast(int)
将读取的字节发送回所有Client
实现。
问题:
class Server
的InputStream没有读取从class Clients
的OutputStream发送的所有字节,因此它被卡在while((read = is.read()) != -1)
循环中,因为流从未返回-1。
我试图找到解决方案,为什么InputStream没有读取所有字节,但是在任何地方都提到使用read(byte[],int,int)
而不是read()
。但我的问题是为什么。为什么InputStream没有读取所有字节,为什么在这种情况下从不返回-1?