Java中的Socket上传下载

在网络编程中,Socket是一种端到端的通信协议,它允许程序在网络中进行数据的传输。Java提供了一套完整的API来实现Socket编程。本文将介绍如何在Java中使用Socket进行文件的上传和下载。

流程图

首先,我们通过流程图来展示Socket上传下载的基本流程:

flowchart TD
    A[开始] --> B[客户端发起连接请求]
    B --> C{服务端是否接受连接}
    C -- 是 --> D[服务端与客户端建立连接]
    C -- 否 --> E[连接失败]
    D --> F[客户端发送文件请求]
    F --> G{服务端是否接收到请求}
    G -- 是 --> H[服务端读取文件并发送给客户端]
    G -- 否 --> I[请求失败]
    H --> J[客户端接收文件]
    J --> K[文件传输完成]
    K --> L[结束]

客户端代码示例

以下是使用Java Socket进行文件下载的客户端代码示例:

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try {
            // 创建Socket连接到服务器
            Socket socket = new Socket("localhost", 12345);
            
            // 从服务器接收文件
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            
            // 关闭连接
            in.close();
            socket.close();
        } catch (UnknownHostException e) {
            System.err.println("无法连接到服务器: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("I/O 错误: " + e.getMessage());
        }
    }
}

服务端代码示例

以下是使用Java Socket进行文件上传的服务端代码示例:

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) {
        try {
            // 创建服务器Socket并监听端口
            ServerSocket serverSocket = new ServerSocket(12345);
            System.out.println("服务器启动,等待连接...");

            // 接受客户端连接
            Socket socket = serverSocket.accept();
            System.out.println("客户端已连接");

            // 读取文件并发送给客户端
            FileInputStream fis = new FileInputStream("example.txt");
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            int c;
            while ((c = fis.read()) != -1) {
                out.write(c);
            }

            // 关闭连接
            fis.close();
            out.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            System.err.println("I/O 错误: " + e.getMessage());
        }
    }
}

总结

通过上述示例,我们可以看到Java Socket编程在文件上传下载方面的应用。客户端通过建立连接,发送请求,接收文件;服务端则监听端口,接受连接,读取文件并发送给客户端。需要注意的是,实际应用中可能需要处理更多的异常情况,以及进行更复杂的数据传输和协议设计。希望本文能够帮助你理解并掌握Java中的Socket上传下载。