Socket编程(文字流程+核心代码)

用文字描述使用Socket技术实现客户端与服务器之间进行文本文件传输的实现过程
具体要求为:
客户端发送文件名到服务器
服务器接收文件名后在指定目录下判断有无该文本文件
有该文件则传输该文件到客户端, 无则告知客户端无此文件
讲述实现过程及列出核心代码

引用 皆我百晓生 小程序回复内容作答:
实现过程:

  1. 客户端与服务器建立Socket连接。
  2. 客户端向服务器发送文件名。
  3. 服务器接收文件名后,在指定目录下判断是否存在该文本文件。
  4. 若存在该文件,则服务器将文件传输给客户端。
  5. 若不存在该文件,则服务器向客户端发送错误信息。
  6. 客户端接收文件或错误信息。
  7. 客户端与服务器断开Socket连接。

核心代码:

服务器端:

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

public class Server {
    public static void main(String[] args) {
        try {
            // 创建ServerSocket对象,绑定端口
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("服务器已启动,等待客户端连接...");

            // 监听客户端连接请求
            Socket socket = serverSocket.accept();

            // 获取输入流,读取文件名
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String filename = reader.readLine();
            System.out.println("服务器收到文件名:" + filename);

            // 判断文件是否存在
            File file = new File("指定目录路径" + filename);
            if (file.exists()) {
                // 文件存在,创建输出流,传输文件给客户端
                OutputStream outputStream = socket.getOutputStream();
                FileInputStream fileInputStream = new FileInputStream(file);
                byte[] buffer = new byte[1024];
                int length;
                while ((length = fileInputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, length);
                }
                fileInputStream.close();
                outputStream.close();
                System.out.println("文件传输完成");
            } else {
                // 文件不存在,返回错误信息给客户端
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("文件不存在".getBytes());
                outputStream.close();
                System.out.println("文件不存在,错误信息已发送");
            }

            // 关闭连接
            reader.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
   }
}

客户端:

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

public class Client {
    public static void main(String[] args) {
        try {
            // 创建Socket对象,指定服务器IP和端口
            Socket socket = new Socket("服务器IP", 8888);

            // 创建输出流,发送文件名给服务器
            PrintWriter writer = new PrintWriter(socket.getOutputStream());
            writer.println("文件名");
            writer.flush();
            System.out.println("文件名已发送");

            // 创建输入流,接收服务器返回的文件或错误信息
            InputStream inputStream = socket.getInputStream();
            // 创建输出流,写入文件
            FileOutputStream fileOutputStream = new FileOutputStream("保存文件的路径");

            byte[] buffer = new byte[1024];
            int length;
            // 读取服务器返回的数据
            while ((length = inputStream.read(buffer)) != -1) {
                // 将数据写入文件
                fileOutputStream.write(buffer, 0, length);
            }
            System.out.println("文件接收完成");

            // 关闭连接
            fileOutputStream.close();
            inputStream.close();
            writer.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
   }
}

需要替换的内容:

  • 服务器端代码中的指定目录路径改成实际的文件存储路径。
  • 服务器端代码中的服务器IP改成实际的服务器IP。
  • 客户端代码中的服务器IP改成实际的服务器IP。
  • 客户端代码中的文件名改成实际的待请求文件名。
  • 客户端代码中的保存文件的路径改成实际的文件保存路径。

可私聊,帮忙解决

题主,这个问题我来替你解决(参考结合AI智能、文心一言),若有帮助,还望采纳,点击回答右侧采纳即可。


实现过程:

  1. 客户端发送文件名到服务器
  2. 服务器接收文件名
  3. 服务器在指定目录下查找是否有该文件
  4. 如果有,服务器将该文件传输给客户端
  5. 如果没有,服务器告知客户端无此文件

Java核心代码:

客户端代码:

// 1. 客户端发送文件名到服务器
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(fileName);
dataOutputStream.flush();

// 4. 如果有,服务器将该文件传输给客户端
InputStream inputStream = socket.getInputStream();
if (inputStream.read() != -1) {
    FileOutputStream fileOutputStream = new FileOutputStream(new File("path/to/save/file"));
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) != -1) {
        fileOutputStream.write(buffer, 0, length);
    }
    fileOutputStream.close();
}

// 5. 如果没有,服务器告知客户端无此文件
else {
    System.out.println("文件不存在");
}
socket.close();

服务器端代码:

// 2. 服务器接收文件名
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String fileName = dataInputStream.readUTF();

// 3. 服务器在指定目录下查找是否有该文件
File file = new File("path/to/search/file");
if (file.exists() && file.isFile()) {
    // 4. 如果有,服务器将该文件传输给客户端
    OutputStream outputStream = socket.getOutputStream();
    FileInputStream fileInputStream = new FileInputStream(file);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = fileInputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, length);
    }
    fileInputStream.close();
    outputStream.flush();
}

// 5. 如果没有,服务器告知客户端无此文件
else {
    OutputStream outputStream = socket.getOutputStream();
    outputStream.write(-1);
    outputStream.flush();
}
socket.close();

// 1. 客户端发送文件名到服务器
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(fileName);
dataOutputStream.flush();
// 4. 如果有,服务器将该文件传输给客户端
InputStream inputStream = socket.getInputStream();
if (inputStream.read() != -1) {
    FileOutputStream fileOutputStream = new FileOutputStream(new File("path/to/save/file"));
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) != -1) {
        fileOutputStream.write(buffer, 0, length);
    }
    fileOutputStream.close();
}
// 5. 如果没有,服务器告知客户端无此文件
else {
    System.out.println("文件不存在");
}
socket.close();

简单来说,分为3个步骤,分别是
1、建立连接
两个接口一个模仿服务器,一个模仿客户端 服务器创建服务端口,
客户端根据端口号和ip创建两者间的连接
2、发送文件
客户端将文件以输入流的方式传给服务器
服务器利用socket.getInputStream()方法获取到客户端传进来的输入流,并将其接收存放
3、接收反馈信息
服务器接收成功后利用输出流向客户端发出反馈
客户端接收导服务器的输出信息并打印下来(也可以是存为文件)

详细参考