Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

JAVA socket传输文件


在 Java 中使用 Socket 进行文件传输有多种方式,我将为你介绍两种常见的方式:基于普通的 Socket 编程和基于 NIO(New I/O)的方式。每种方式都会包括详细的步骤流程和示例代码。

基于普通的 Socket 编程

这种方式使用普通的阻塞式 Socket 编程来实现文件传输。以下是步骤流程:

步骤流程:

  1. 服务器创建一个 ServerSocket 并等待客户端连接。
  2. 客户端创建一个 Socket 并连接到服务器。
  3. 客户端读取文件内容,通过 Socket 发送给服务器。
  4. 服务器接收客户端发送的文件内容,写入文件。

示例代码:

服务器端:

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

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(12345);
        System.out.println("Server waiting for connection...");

        Socket socket = serverSocket.accept();
        System.out.println("Connection established.");

        InputStream inputStream = socket.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream("received_file.txt");

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            fileOutputStream.write(buffer, 0, bytesRead);
        }

        System.out.println("File received successfully.");

        fileOutputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

客户端端:

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

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 12345);

        File file = new File("file_to_send.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        OutputStream outputStream = socket.getOutputStream();

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }

        System.out.println("File sent successfully.");

        outputStream.close();
        fileInputStream.close();
        socket.close();
    }
}

Maven 依赖: 无需额外的 Maven 依赖。

基于 NIO(New I/O)

这种方式使用 Java NIO 中的通道(Channel)和缓冲区(Buffer)来实现非阻塞的文件传输。以下是步骤流程:

步骤流程:

  1. 服务器创建一个 ServerSocketChannel,并注册到 Selector 中以侦听连接事件。
  2. 客户端创建一个 SocketChannel,并连接到服务器。
  3. 服务器通过 Selector 监听连接事件,并处理就绪的通道。
  4. 通道之间进行文件内容的传输。

示例代码:

服务器端:

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;

public class ServerNIO {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(12345));
        serverSocketChannel.configureBlocking(false);

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        System.out.println("Server waiting for connection...");

        while (true) {
            selector.select();
            for (SelectionKey key : selector.selectedKeys()) {
                if (key.isAcceptable()) {
                    SocketChannel clientChannel = serverSocketChannel.accept();
                    clientChannel.configureBlocking(false);
                    clientChannel.register(selector, SelectionKey.OP_READ);
                    System.out.println("Connection established.");
                } else if (key.isReadable()) {
                    SocketChannel clientChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);

                    FileChannel fileChannel = new FileOutputStream("received_file_nio.txt").getChannel();

                    int bytesRead;
                    while ((bytesRead = clientChannel.read(buffer)) > 0 || buffer.position() > 0) {
                        buffer.flip();
                        fileChannel.write(buffer);
                        buffer.compact();
                    }

                    fileChannel.close();
                    clientChannel.close();
                    System.out.println("File received successfully.");
                }
            }
            selector.selectedKeys().clear();
        }
    }
}

客户端端:

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;

public class ClientNIO {
    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 12345));

        File file = new File("file_to_send.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        FileChannel fileChannel = fileInputStream.getChannel();

        ByteBuffer buffer = ByteBuffer.allocate(1024);
        while (fileChannel.read(buffer) > 0 || buffer.position() > 0) {
            buffer.flip();
            socketChannel.write(buffer);
            buffer.compact();
        }

        System.out.println("File sent successfully.");

        fileChannel.close();
        socketChannel.close();
    }
}

Maven 依赖: 无需额外的 Maven 依赖。

以上是基于普通 Socket 编程和基于 NIO 的两种文件传输方式的示例代码和步骤流程。你可以根据自己的需求选择适合的方式来实现文件传输。

请注意,UDP是一种无连接的协议,因此在使用UDP传输文件时需要考虑数据完整性和可靠性的问题。###方式一:基本UDP传输这种方式通过UDP ...
在Java中,实现Socket心跳通常用于保持客户端和服务器之间的连接活跃状态,防止连接超时或断开。gradle`中添加依赖:客户端:服务器 ...
在Java中,要通过Socket绑定多个IP地址,可以使用不同的方法。###方法一:使用多个ServerSocket实例在这种方法中,我们为 ...
在Java中进行文件操作有多种方式,下面我将列出一些常见的文件操作方式,并为每种方式提供详细的步骤、示例代码以及Maven和Gradle的依 ...
在Java中生成文件有多种方式,以下是一些常见的实现方式,以及每种方式的详细步骤流程和示例代码。创建一个`BufferedOutputStr ...