Java TCP 实现文件传输
环境
CentOS Linux release 8.1.1911 (Core)
java version "14.0.2" 2020-07-14
实现代码
ReceiveFileServer
其中,<port>
为接收文件进程使用的端口号
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ReceiveFileServer {
private static final int PORT = <port>;
private static final int BUFFER_SIZE = 1000;
public static void main(String[] args) {
try {
while (true) {
ServerSocket serverSocket = new ServerSocket(PORT);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
String fileName = bufferedReader.readLine().toString();
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
socket = serverSocket.accept();
inputStream = socket.getInputStream();
byte[] buffer = new byte[BUFFER_SIZE];
int length = 0;
while ((length = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, length);
}
fileOutputStream.flush();
System.out.println("Receive file [" + fileName + "]");
socket.close();
serverSocket.close();
fileOutputStream.close();
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
SendFileClient
其中<hostname>
为服务器IP地址,<port>
为接收文件进程使用的端口号,与上述服务器端代码中的端口号一致
sendMessage
方法中的message
变量为在服务器中保存的路径
package com.demo.filetransmission;
import java.io.*;
import java.net.Socket;
import java.util.Arrays;
public class SendFileClient {
private static final String IP = "<hostname>";
private static final int PORT = <port>;
public void sendMessage(String message) {
Socket socket = null;
OutputStream outputStream = null;
try {
socket = new Socket(IP, PORT);
outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
System.out.println("Sending...");
System.out.println(message);
dataOutputStream.write(message.getBytes("utf-8"));
dataOutputStream.flush();
System.out.println("Send Successfully!");
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} catch (UnknownError e) {
e.printStackTrace();
} finally {
try {
socket.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void uploadFile(String fileName) {
Socket socket = null;
FileInputStream fileInputStream = null;
OutputStream outputStream = null;
OutputStream fileNameOutputStream = null;
DataOutputStream dataOutputStream;
try {
socket = new Socket(IP, PORT);
fileInputStream = new FileInputStream(fileName);
outputStream = socket.getOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
}
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} catch (UnknownError e) {
e.printStackTrace();
} finally {
try {
fileInputStream.close();
socket.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
SendFileClient client = new SendFileClient();
client.sendMessage("./res/file.mp4");
client.uploadFile("./res/file.mp4");
}
}
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!