Java 客户';s BufferedInputStream.read(),而循环从不停止
我编辑了代码Java 客户';s BufferedInputStream.read(),而循环从不停止,java,file-io,file-transfer,Java,File Io,File Transfer,我编辑了代码 class SendFileThread extends Thread { private ServerSocket fileTransferServerSocket; private Socket fileTransferSocket; private BufferedReader requestReader; private PrintWriter requestAnswerer; private BufferedOutputStream
class SendFileThread extends Thread {
private ServerSocket fileTransferServerSocket;
private Socket fileTransferSocket;
private BufferedReader requestReader;
private PrintWriter requestAnswerer;
private BufferedOutputStream fileWriter;
private int fileTransferPort = 12345;
public SendFileThread() {
try {
fileTransferServerSocket = new ServerSocket(fileTransferPort);
fileTransferSocket = fileTransferServerSocket.accept();
requestReader = new BufferedReader(new InputStreamReader(fileTransferSocket.getInputStream()));
fileWriter = new BufferedOutputStream(fileTransferSocket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void CloseTransferStream() {
try {
requestAnswerer.close();
requestReader.close();
fileWriter.close();
fileTransferSocket.close();
fileTransferServerSocket.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
public void SendFile(String filename) {
try {
File file = new File(CLIENT_PATH + "/" + filename);
BufferedInputStream fileReader = new BufferedInputStream(new FileInputStream(file));
int packet;
while((packet = fileReader.read()) != -1)
fileWriter.write(packet);
fileWriter.flush();
fileReader.close();
}
catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
//System.out.print(filename + " send complete (" + count + " times)");
}
public void ListenForRequester() {
try {
String input;
while((input = requestReader.readLine()) != null) {
if(input.equals("request file")) {
SendFile(requestReader.readLine());
}
else if(input.equals("end transfer"))
break;
else {
System.out.println("Something wrong");
}
}
}
catch(IOException ioe) {
ioe.getStackTrace();
}
}
public void run() {
ListenForRequester();
CloseTransferStream();
}
}
class ReceiveFileThread extends Thread {
private Socket fileTransferSocket;
private int fileTransferPort = 12345;
private BufferedInputStream fileReader;
private PrintWriter fileRequester;
public ReceiveFileThread() {
try {
fileTransferSocket = new Socket(serverIP, fileTransferPort);
fileRequester = new PrintWriter(fileTransferSocket.getOutputStream(), true);
fileReader = new BufferedInputStream(fileTransferSocket.getInputStream());
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
public void CloseTransferStream() {
try {
fileRequester.close();
fileReader.close();
fileTransferSocket.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
public synchronized void RequestFile(String filename) {
fileRequester.println("request file");
fileRequester.println(filename);
}
public synchronized void SendEndMsg() {
fileRequester.println("end transfer");
}
public void run() {
for(int i = 0;i < fileList.size();i++) {
String filename = (String)fileList.get(i);
RequestFile(filename);
try {
BufferedOutputStream fileWriter = new BufferedOutputStream(new FileOutputStream(new File(PROGRAM_PATH + "/" + filename)));
int packet = 0;
while((packet = fileReader.read()) > -1)
fileWriter.write(packet);
System.out.println("file receive complete");
fileWriter.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
SendEndMsg();
CloseTransferStream();
}
}
我正在用java制作文件传输程序
我必须发送21个文件
我的代码在run()
(它不打印“文件接收完成”)-1)
fileWriter.write(数据包);
System.out.println(“文件接收完成”);
fileWriter.close();
}
catch(filenotfounde异常){
e、 printStackTrace();
}
捕获(IOE异常){
e、 printStackTrace();
}
}
SendEndMsg();
CloseTransferStream();
}
}
这一错误困扰了我5天:(
有人能帮我避免这个错误吗?关闭套接字的输出流将关闭套接字,为了发送多个文件,您必须做一些更改 服务器: 在开始发送文件之前,先发送该文件的长度 客户:
收到文件长度后,开始从输入流中读取这么多字节并将它们保存到文件中,当您读取完下一个文件的长度时。在
发送文件(…)
method您正在关闭fileWriter
,它关闭套接字的输出流,并且无法重新打开。但是如果我在run()之前设置fileWriter
,并在CloseTransferStream()关闭它
,客户端的while循环从未停止。@titusy您是对的,要发送多个文件,您必须先发送文件大小,然后从输入流中读取那么多字节到文件中。