Я пытаюсь создать очень barebones файловый сервер, который ничего не делает, кроме загрузки zip-файла и выхода, но у меня проблемы. У меня две основные проблемы.Базовый Java Fileserver
Во-первых, когда я тестирую локальный хост, это работает, потому что он переносит zip-файл, но когда я пытаюсь его открыть, я получаю сообщение об ошибке, когда он поврежден. Это может быть связано с форматом zip-файла или тем, как я его передаю.
Вторая проблема заключается в том, что она терпит неудачу, когда я использую что-либо, кроме локального. Я пробовал перенаправление веб-сайта на свой IP-адрес и просто вставляю свой IP-адрес, и оба не работают, даже когда я отключу все брандмауэры и антивирус.
Серверный код:
import java.io.*;
import java.net.*;
public class FileServer {
public static void main(String[] args) throws IOException {
final int PORT_NUMBER = 44444;
ServerSocket serverSock = null;
PrintWriter out = null;
BufferedInputStream bin = null;
OutputStream os = null;
Socket clientSock = null;
File file;
byte[] fileData;
String filename = "file.zip";
while(true) {
try {
//Listen on port
serverSock = new ServerSocket(PORT_NUMBER);
//Get connection
clientSock = serverSock.accept();
System.out.println("Connected client");
//Get output stream
out = new PrintWriter(clientSock.getOutputStream(), true);
out.println(filename); //Print filename
file = new File(filename); //Get file
fileData = new byte[(int)file.length()]; //Stores the file data
bin = new BufferedInputStream(new FileInputStream(file));
out.println((int)file.length()); //Print filesize
bin.read(fileData); //Read contents of file
os = clientSock.getOutputStream();
os.write(fileData); //Write the file data
os.flush();
} catch(SocketException e) {
System.out.println("Client disconnected");
} catch(Exception e) {
System.out.println(e.getMessage());
System.exit(1);
} finally {
//Close all connections
System.out.println("Shutting down");
if(os != null) {
os.close();
}
if(bin != null) {
bin.close();
}
if(out != null) {
out.close();
}
if(clientSock != null) {
clientSock.close();
}
if(serverSock != null) {
serverSock.close();
}
}
}
}
}
Client фрагмент кода, предположим, что все синтаксис является правильным, а все остальное существует и работает, потому что я, вероятно, несовпадающими некоторые скобки или что-то, когда я вырезать фрагмент из.
import java.io.*;
import java.net.*;
import javax.swing.JOptionPane;
public static void main(String[] args) {
final int PORT_NUMBER = 44444;
final String HOSTNAME = "127.0.0.1";
String filename = "default.txt";
Socket sock = null;
BufferedReader in = null;
BufferedOutputStream bos = null;
InputStream is = null;
byte[] fileData;
//Attempt to connect
try {
sock = new Socket(HOSTNAME, PORT_NUMBER);
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
is = sock.getInputStream();
} catch(UnknownHostException e) {
JOptionPane.showMessageDialog(this, "Error: could not connect to host " + HOSTNAME + " on port number " + PORT_NUMBER);
System.exit(1);
} catch(ConnectException e) {
JOptionPane.showMessageDialog(this, "Error: connection refused");
System.exit(1);
} catch(Exception e) {
JOptionPane.showMessageDialog(this, e);
System.exit(1);
}
try {
filename = in.readLine();
bos = new BufferedOutputStream(new FileOutputStream(filename));
fileData = new byte[Integer.decode(in.readLine())]; //Gets file size
is.read(fileData);
bos.write(fileData);
bos.flush();
bos.close();
if(is != null) {
is.close();
}
if(in != null) {
in.close();
}
if(bos != null) {
bos.close();
}
if(sock != null) {
sock.close();
}
} catch(Exception e) {
JOptionPane.showMessageDialog(this, e);
System.exit(1);
}
JOptionPane.showMessageDialog(this, "Download complete");
}
}
}
}
EDIT: Это прекрасно работает на локальном хосте с .doc и .docx файлов, это только .zip, что вызывает проблемы.
Я думаю, что ты прав. Я просто сравнил шестнадцатеричные дампы двух ZIP-файлов. Они идентичны до позиции 0000FFF0, затем оригинал продолжается, пока копия заполняется пробелами. Кажется, что BufferedReader не влияет на него, начальные строки все одинаковы, но он не может прочитать весь файл. Не могли бы вы привести пример того, что я должен делать с циклом? –
Я добавил пример моего ответа. –
Спасибо. Теперь он может переносить zip. –