请简述使用TCP通信的相关知识,编写一个文件上传的程序的思路。
时间: 2024-03-11 18:47:46 浏览: 140
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议,它保证了数据的可靠传输。在使用TCP进行通信时,需要先建立连接,然后进行数据的传输,最后再关闭连接。
文件上传程序的思路如下:
1. 客户端与服务器建立TCP连接。
2. 客户端选择要上传的文件,并将文件内容读取到一个字节数组中。
3. 客户端将文件名和字节数组发送给服务器。
4. 服务器接收到文件名和字节数组后,将文件保存到指定目录下。
5. 服务器将保存结果发送给客户端。
6. 客户端接收到保存结果后,关闭连接。
下面是一个简单的文件上传程序的示例代码:
客户端代码:
```java
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 8000); // 创建客户端Socket对象,连接服务器
OutputStream os = socket.getOutputStream(); // 获取输出流,用于发送数据
String filePath = "D:\\test.txt"; // 要上传的文件路径
File file = new File(filePath);
String fileName = file.getName(); // 获取文件名
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len); // 将文件内容写入输出流
}
socket.shutdownOutput(); // 关闭输出流
InputStream is = socket.getInputStream(); // 获取输入流,用于接收服务器的响应
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] responseBuffer = new byte[1024];
while ((len = is.read(responseBuffer)) != -1) {
baos.write(responseBuffer, 0, len); // 将服务器的响应写入字节数组输出流
}
System.out.println("上传结果:" + baos.toString());
fis.close(); // 关闭文件输入流
os.close(); // 关闭输出流
is.close(); // 关闭输入流
baos.close(); // 关闭字节数组输出流
socket.close(); // 关闭客户端Socket对象
}
}
```
服务器端代码:
```java
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8000); // 创建服务器Socket对象,监听8000端口
System.out.println("服务器已启动,等待客户端连接...");
Socket socket = serverSocket.accept(); // 等待客户端连接
InputStream is = socket.getInputStream(); // 获取输入流,用于接收数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len); // 将客户端发送的数据写入字节数组输出流
}
byte[] data = baos.toByteArray();
String filePath = "D:\\upload\\"; // 保存文件的目录
String fileName = new String(data, 0, data.length - 1); // 获取文件名
FileOutputStream fos = new FileOutputStream(filePath + fileName);
fos.write(data, fileName.getBytes().length + 1, data.length - fileName.getBytes().length - 1); // 将文件内容写入文件输出流
fos.close(); // 关闭文件输出流
OutputStream os = socket.getOutputStream(); // 获取输出流,用于发送响应
os.write("上传成功!".getBytes()); // 发送响应
is.close(); // 关闭输入流
os.close(); // 关闭输出流
baos.close(); // 关闭字节数组输出流
socket.close(); // 关闭Socket对象
serverSocket.close(); // 关闭服务器Socket对象
}
}
```
以上程序可以实现将本地指定路径下的文件上传到服务器指定路径下的功能。需要注意的是,文件上传时应该对文件进行校验并设置文件上传的最大限制,以防文件过大导致服务器崩溃。
阅读全文