gpt4 book ai didi

java - 如何通过 Java 套接字使用 IOUtils.copy 传输文件

转载 作者:行者123 更新时间:2023-11-30 09:19:13 25 4
gpt4 key购买 nike

我目前正在使用 Java 套接字。我已经创建了一个服务器端代码和客户端代码来通过套接字传输文件。我已经在同一个系统中成功地将文件从客户端传输到服务器,但是如果我尝试在不同平台上使用不同系统,那么它就不起作用了。服务器端和客户端代码如下。

服务端代码

public class FileTransferTestServer extends Thread{

private final Socket socket;

public FileTransferTestServer(Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

try {
ServerSocket serverSocket = new ServerSocket(5000);
Socket socket = serverSocket.accept();
System.out.println("Connection Established with "+socket.getInetAddress().getHostAddress());
new FileTransferTestServer(socket).start();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void run(){
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String buffer = null;
String fileName = null;

if((buffer = br.readLine()) != null){
fileName = buffer;
}

FileOutputStream fos = new FileOutputStream(fileName);
int res = IOUtils.copy(is, fos);
System.out.println("res : "+res);
is.close();
fos.flush();fos.close();
br.close();


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

客户端代码

public class FileTransferClient {

public FileTransferClient() {
// TODO Auto-generated constructor stub
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

try {
Socket socket = new Socket("172.16.4.23",5000);
File file = new File("/Users/Guest/Desktop/DQM.txt");
OutputStream outputStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream);
out.println("file-transfer");
out.flush();
out.println(""+file.getName());
out.flush();
FileInputStream fis = new FileInputStream(file);
int res = IOUtils.copy(fis, outputStream);
out.flush();
outputStream.flush();
outputStream.close();
fis.close();
System.out.println("res : "+res);
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

如何让这个程序在系统间传输文件

我试过 Windows(服务器)和 Mac OS X(客户端)和 Windows(服务器)和 LinuxMint(客户端)

注意:1. 我想发送文件名和文件内容。2.文件内容可以是任何形式(文本或二进制文件)

最佳答案

你不能在同一个流中混合测试和二进制文件,除非你真的知道你在做什么。在这种情况下,BufferedReader 假定您从现在开始只会使用此读取器,并且它可以读取尽可能多的可用数据。这意味着它可以读取您打算用于文件的数据。

我建议您使用 DataInput/OutputStream,并且仅此而已。您可以对文本使用 writeUtf/readUTF。

Socket socket = new Socket("172.16.4.23",5000);
String pathname = "/Users/Guest/Desktop/DQM.txt";
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
outputStream.writeUTF(pathname);
FileInputStream fis = new FileInputStream(pathname);
int res = IOUtils.copy(fis, dos);
fis.close();
dos.close();
socket.close();

阅读

DataInputStream dis = new DataInputStream(socket.getInputStream());
String fileName = dis.readUTF();
FileOutputStream fos = new FileOutputStream(fileName);
int res = IOUtils.copy(dis, fos);
fos.close();
socket.close();

关于java - 如何通过 Java 套接字使用 IOUtils.copy 传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18054154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com