Java TCP网络编程:从Socket基础到文件上传实战

Jasper
Jasper
发布时间:2026-10-16 | 2人浏览过
原创

本文深入讲解Java中的TCP网络编程技术。通过解析IP、端口、Socket等核心概念,结合具体代码实例,演示如何使用Socket和ServerSocket建立连接并进行数据交换,同时提供文件上传的完整实战案例,涵盖从本地读取文件、网络传输到服务器保存的全流程。

核心概念与通信机制

Java网络编程主要基于TCP协议进行可靠的数据传输。理解以下关键要素是编写正确程序的前提:

  • IP地址:标识网络上设备的逻辑地址,用于定位目标主机。
  • TCP协议(传输控制协议):面向连接的协议,类似电话通话,需先建立连接再传输数据,确保数据准确且有序到达。
  • UDP协议:无连接协议,不保证可靠性但速度较快,适用于视频流等场景。
  • 端口(Port):应用程序在主机上的入口,IP与端口组合可唯一标识一个进程。
  • 套接字(Socket):通信端点的抽象,Java中通过java.net.Socket(客户端)和java.net.ServerSocket(服务端)实现。

基础通信实现步骤

TCP通信的基本流程包含客户端发起请求和服务端响应两个部分。

第1步:客户端发送数据

客户端通过创建Socket对象连接到指定IP和端口,获取输出流写入数据,并通过输入流接收服务端的回应。操作完成后需关闭资源。

public static void main(String[] args) throws IOException {
    //1.创建客户端Socket,绑定服务器IP和端口
    Socket socket = new Socket("127.0.0.1", 8888);
    
    //2.获取网络字节输出流
    OutputStream os = socket.getOutputStream();
    //3.发送数据给服务器
    os.write("你好服务器".getBytes());
    
    //4.获取网络字节输入流
    InputStream is = socket.getInputStream();
    //5.读取服务器回写数据
    byte[] bytes = new byte[1024];
    int len = is.read(bytes);
    System.out.println(new String(bytes, 0, len));
    
    //6.关闭资源
    socket.close();
}

第2步:服务端接收与回写数据

服务端首先创建ServerSocket监听指定端口,调用accept()阻塞等待客户端连接。连接建立后,分别获取输入流读取客户端数据,通过输出流回写响应信息。

public static void main(String[] args) throws IOException {
    //1.创建服务器ServerSocket,指定端口号
    ServerSocket server = new ServerSocket(8888);
    
    //2.侦听并接受连接,返回Socket对象
    Socket socket = server.accept();
    
    //3.获取网络字节输入流读取客户端数据
    InputStream is = socket.getInputStream();
    byte[] bytes = new byte[1024];
    int len = is.read(bytes);
    System.out.println(new String(bytes, 0, len));
    
    //4.获取网络字节输出流并回写数据
    OutputStream os = socket.getOutputStream();
    os.write("收到谢谢".getBytes());
    
    //5.释放资源
    socket.close();
    server.close();
}

实战练习:文件上传功能

基于上述基础,下面演示如何实现文件上传。主要逻辑为:客户端以流的方式循环读取本地文件并发送到服务端,服务端接收数据并写入本地磁盘。需注意在发送完所有数据后调用shutdownOutput()标记结束,否则服务端read()将一直阻塞等待。

第3步:客户端上传文件

使用FileInputStream读取本地文件,循环写入Socket的输出流,最后通过getInputStream()读取服务器确认信息。

public static void main(String[] args) throws IOException {
    //1.创建本地文件输入流,指向源文件
    FileInputStream fis = new FileInputStream("c:\\1.jpg");
    //2.创建客户端Socket连接服务器
    Socket socket = new Socket("127.0.0.1", 8888);
    //3.获取网络输出流
    OutputStream os = socket.getOutputStream();
    
    //4.循环读取文件内容并发送给服务器
    int len = 0;
    byte[] bytes = new byte[1024];
    while ((len = fis.read(bytes)) != -1) {
        os.write(bytes, 0, len);
    }
    
    //重要:发送完文件后,禁用输出流以通知服务器数据传输结束
    socket.shutdownOutput();
    
    //6.获取网络输入流,读取服务端回写的反馈
    InputStream is = socket.getInputStream();
    while ((len = is.read(bytes)) != -1) {
        System.out.println(new String(bytes, 0, len));
    }
    
    //8.释放资源
    fis.close();
    socket.close();
}

第4步:服务端保存文件

服务端接收数据前需确保目标目录存在。循环读取网络输入流并将数据写入FileOutputStream,直到读取完毕(由客户端的shutdownOutput()触发流结束)。成功后回写提示信息。

public static void main(String[] args) throws IOException {
    //1.创建服务器Socket监听端口
    ServerSocket server = new ServerSocket(8888);
    //2.获取客户端Socket连接
    Socket socket = server.accept();
    
    //3.获取网络输入流读取上传的文件数据
    InputStream is = socket.getInputStream();
    
    //4.判断目标文件夹是否存在,不存在则创建
    File file = new File("d:\\upload");
    if (!file.exists()) {
        file.mkdirs();
    }
    
    //5.创建本地文件输出流,绑定保存路径
    FileOutputStream fos = new FileOutputStream(file + "\\1.jpg");
    
    //6.循环读取网络数据并保存到本地硬盘
    int len = 0;
    byte[] bytes = new byte[1024];
    while ((len = is.read(bytes)) != -1) {
        fos.write(bytes, 0, len);
    }
    
    //8-9.获取输出流并给客户端回写成功信息
    socket.getOutputStream().write("上传成功".getBytes());
    
    //10.释放资源
    fos.close();
    socket.close();
    server.close();
}

以上就是Java TCP网络编程及文件上传功能的详细内容,更多关于Java网络开发实战的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表