Java:将文件从服务器传输到客户端,从客户端传输到服务器
我是一个新手,我想完成从服务器到客户端的文件传输“用它做点什么”,然后将文件发送回服务器。我使用的最基本的代码如下:Java:将文件从服务器传输到客户端,从客户端传输到服务器,java,sockets,client,server,Java,Sockets,Client,Server,我是一个新手,我想完成从服务器到客户端的文件传输“用它做点什么”,然后将文件发送回服务器。我使用的最基本的代码如下: import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
ServerSocket servsock = new ServerSocket(123456);
File myFile = new File("s.pdf");
while (true) {
Socket sock = servsock.accept();
byte[] mybytearray = new byte[(int) myFile.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
bis.read(mybytearray, 0, mybytearray.length);
OutputStream os = sock.getOutputStream();
os.write(mybytearray, 0, mybytearray.length);
os.flush();
sock.close();
}
}
}
The client module
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
public class Main {
public static void main(String[] argv) throws Exception {
Socket sock = new Socket("127.0.0.1", 123456);
byte[] mybytearray = new byte[1024];
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream("s.pdf");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead = is.read(mybytearray, 0, mybytearray.length);
bos.write(mybytearray, 0, bytesRead);
bos.close();
sock.close();
}
}
从本网站获得:
我了解这是如何工作的,但我不知道如何将文件发送回服务器。
请提供帮助。我以前编写过一个文件传输类,您可以在客户端和服务器中使用它(通过创建实例),并使用这些方法发送和接收您想要的文件
import java.io.*;
import java.net.Socket;
public class FileTransferProcessor {
Socket socket;
InputStream is;
FileOutputStream fos;
BufferedOutputStream bos;
int bufferSize;
FileTransferProcessor(Socket client) {
socket = client;
is = null;
fos = null;
bos = null;
bufferSize = 0;
}
void receiveFile(String fileName) {
try {
is = socket.getInputStream();
bufferSize = socket.getReceiveBufferSize();
System.out.println("Buffer size: " + bufferSize);
fos = new FileOutputStream(fileName);
bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[bufferSize];
int count;
while ((count = is.read(bytes)) >= 0) {
bos.write(bytes, 0, count);
}
bos.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
void sendFile(File file) {
FileInputStream fis;
BufferedInputStream bis;
BufferedOutputStream out;
byte[] buffer = new byte[8192];
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
out = new BufferedOutputStream(socket.getOutputStream());
int count;
while ((count = bis.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
fis.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
插座是双向的。保持打开状态并从服务器读取响应。我建议您使用HTTP,并且您的“服务器”是一个简单的servlet。然后您只需读取请求并回答响应,servlet API将为您完成其余的工作(在客户端上是HTTPURLConnection或其他HTTPClient代码)。@jtahlborn那么我是否要省略服务器和客户端上的sock.close(),然后添加写入和读取数据的反向链?@eckes感谢您的建议,但是你认为不使用HTTP就可以解决这个问题吗?@meowtwo当然可以。在服务器上刚刚打开的是=socket.getInputStream()和os=socket.getOutputStream()。从一个读到另一个写。只是在生产过程中你需要很多额外的东西来保证它的可靠性。在几个方面质量很差。缓冲区不需要是文件的大小,也不需要是文件附近的大小:这不会扩展到大文件。8192字节对于大多数目的来说是足够的
flush()
beforeclose()
是冗余的,socket.close()在关闭其输入或输出流之后也是冗余的IOExceptions
永远不应该变成布尔值:应该记录它们。应在最后
块中关闭资源。try/catch
然后添加更多代码的模式是不好的做法。依赖于try
块中代码成功的代码应该在同一try
块中。我同意,谢谢。我不久前写了这篇文章,并记得它在很大程度上是有效的,所以我没有费心去深入研究它。我一有时间就用你的建议来完善它。