我目前正在做家庭作业,我完全被困住了。我是最后一个问题,我无法弄清楚如何完成最后一项任务。以下是我必须完成的任务:
客户应该 将文件保存在“客户端”中 主目录的子目录。
测试你的程序。确保它有效 使用二进制文件,而不仅仅是文本 文件。确保两者都有效 程序在同一台机器上 当他们被分开时 网络。
到目前为止,当我启动服务器时,它会询问我想要使用的端口。然后我启动客户端,它询问使用什么IP和端口。服务器立即发送主目录“server”文件夹中的文件列表。然后我用客户端回复我想下载的文件号。这是我被卡住的地方。我似乎无法找到有关如何执行此操作的任何信息。因此,您可以在我下面发布的代码中看到,我正在尝试使用FileInputReader将文件转换为字节数组。然后我发送给客户。然后我尝试将FileOutputReader收到的字节数组添加到文件中。但我似乎无法找到正确的方法来做到这一点,或者即使我正确地做到了这一点。
客户端
int i = 0;
while(i < 1000){
String modifiedSentence = inFromServer.readLine();
System.out.println("From Server: " + modifiedSentence);
i++;
}
while(j < 1000) {
int byteString = inFromServer.read();
ArrayList<byte[]> bytes = new ArrayList<byte[]>();
bytes.add(byteString);
}
Integer byteInt = new Integer(byteString);
FileOutputStream fo = new FileOutputStream(System.getProperty("user.home")+ "/client/text.txt");
fo.write(byteInt.byteValue());
}
}
服务器
byte[] bytes = new byte[1024];
FileInputStream fi = new FileInputStream(file.toString() + fileArray[userChoiceInt]);
fi.read(bytes, 0, 1024);
outToClient.write(bytes, 0, 1024);
}
}
}
如果有人可以提供任何建议或正确的课程或方法,我将不胜感激。
提前谢谢。
答案 0 :(得分:1)
不破坏整个事情,这里有一些提示。
使用Socket(Server&amp; Client)可以轻松完成。使用byte []传输文件将确保您的程序可以同时使用ascii和二进制文件。
另一种方法是使用远程方法调用(RMI)中的构建。我没有使用这种方法转移文件,但我确信它是可行的。
如果您不知道,通过以下调用完成获取用户主目录:System.getProperty(“user.home”);
答案 1 :(得分:0)
您可以通过Sun(Oracle)查看此tutorial。这应该让您对套接字有基本的了解。
然而我似乎注意到,在客户端,你迭代特定次数(1000)这不是一个好主意,因为一般来说,你不知道要发送的文件的大小,教程应该显示这个以及如何进行适当的更改。此外,您继续在循环中创建结构,因此除了每次创建新的数据结构之外,您都会丢失所收到的任何信息,这是低效的。
您需要做的是从循环外部移动结构的初始化。另外,对于modifiedSentence
变量,您可能希望将其从字符串更改为StringBuilder。
答案 2 :(得分:0)
如果您可以使用IO库,我会建议Netty或Mina。这里有一些网络示例:http://jboss.org/netty/documentation.html
即使你不能使用图书馆,这些也可能有助于学习如何完成任务。
答案 3 :(得分:0)
你可能不应该问这样的网站上如何在课堂上做作业。这是不合适的。你的服务器确实看起来很好。您的程序只能读取最多1024字节的文件。您应该更详细地查看java.io.File。有一种长度方法可用于查找文件的长度,因此您知道要发送多少。