Java实现TCP通信的文件上传

简介: Java实现TCP通信的文件上传

文件上传就是我们本地客户端读取本地的文件,然后把文件上传到服务器,服务器再把文件保存到服务器的硬盘中

首先还是一个客户端一个服务器端,还有一个我们一会儿要上传的文件

客户端 : TCPClient.java

package com.zhanshen.demo_file_upload;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * 客户端读取本地文件,上传到服务器,读取服务器回写的数据
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {
        //1. 创建一个本地字节输入流fileInputStream, 构造方法中绑定要上传的文件
        FileInputStream fileInputStream = new FileInputStream("/home/zhanshen/IdeaProjects/Net/src/com/zhanshen/demo_file_upload/xv.png");
        //2. 创建客户端Socket对象,绑定要上传到服务器的IP地址和端口号
        Socket socket = new Socket("127.0.0.1", 8888);
        //3. 获取网络字节输出流OutputStream
        OutputStream outputStream = socket.getOutputStream();
        //4. 使用FIleInputStream 读取本地文件
        /**
         * 这一次我们的读取是循环读取,因为一个文件会很大,所以我们循环读取每次读取1024
         */
        int len = 0;
        byte[] bytes = new byte[1024];
        while( (len = fileInputStream.read(bytes) ) != -1) {
            //5. 上传到服务器
            outputStream.write(bytes, 0, len);
        }
        socket.shutdownOutput();  //当上传文件结束高速服务器结束了,防止阻塞
        //6. 获取InputStream
        InputStream inputStream = socket.getInputStream();
        //7. 读取服务器返回的数据
        while ( (len = inputStream.read(bytes) ) != -1) {
            System.out.println(new String(bytes, 0, len));
        }
        //8. 释放资源
        fileInputStream.close();
        socket.close();
    }
}

服务器端: TCPServer.java

    package com.zhanshen.demo_file_upload;
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
     * 读取客户端上传的文件,把文件保存到本地  然后回写保存成功等提示消息
     */
    public class TCPServer {
        public static void main(String[] args) throws IOException {
            //1. 创建ServerSocket,指定端口号8888
            ServerSocket serverSocket = new ServerSocket(8888);
            //2. 使用ServerSocket的accept来获得客户端请求的socket对象
            Socket socket = serverSocket.accept();
            //3. 获取socket的输入流
            InputStream inputStream = socket.getInputStream();
            //4. 判断是否有要保存文件的文件夹,若没有就创建一个
            File file = new File("/home/zhanshen/IdeaProjects/Net/src/com/zhanshen/demo_file_upload/upload");
            if(!file.exists()) {   //如果这个文件夹不存在
                file.mkdirs();   //若没有,就创建他
            }
            //5. 创建本地输出流,写入到本地硬盘的位置
            FileOutputStream fileOutputStream = new FileOutputStream(file+"/1.png");
            //6. 使用InputStream 来读取客户端传过来的数据
            int len = 0;
            byte[] bytes = new byte[1024];
            while( (len = inputStream.read(bytes) ) != -1) {
                //7. 写入到硬盘
                fileOutputStream.write(bytes, 0, len);
            }
            //8. 获取socket的OutputStream来给客户端回显数据
            socket.getOutputStream().write("上传成功!".getBytes());
            //9. 释放资源
            fileOutputStream.close();
            socket.close();
            serverSocket.close();
        }
    }

然后我们先启动服务器端,再启动客户端

可以发现文件传了过来

相关文章
|
1月前
|
Java
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
1天前
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。
|
23天前
|
Java
java 文件上传 :MultipartFile 类型转换为file类型
java 文件上传 :MultipartFile 类型转换为file类型
37 9
|
4天前
|
Java
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
|
19天前
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
|
1月前
|
Java
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
1月前
|
缓存 前端开发 Java
在Java项目中实现高性能的文件上传下载
在Java项目中实现高性能的文件上传下载
|
26天前
|
网络协议 Java
如何在Java中使用Socket编程实现TCP连接?
在Java中,通过Socket编程实现TCP连接非常常见。以下演示了基本的TCP通信流程,可根据具体需求进行扩展。
|
1月前
|
Java 数据格式
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
29 0
|
5天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。