java实现TCP协议文件传输

简介: java实现TCP协议文件传输
/**
 * 需求:将指定文件从D盘目录d:\1下移动到d:\2下
 * @param args
 * @throws IOException
 */
public static void main(String[] args) throws IOException {
    //1. 建立输入流和输出流
    FileInputStream fis = new FileInputStream("d:\\1\\1.png");    //源为d盘1目录下文件1.png
    FileOutputStream fos = new FileOutputStream("d:\\2\\2.png");  //目的为d盘2目录下文件2.png
    //2. 使用自定义缓冲区将输入流和输出流关联起来
    byte[] buf = new byte[1024];                  // 定义1024byte的缓冲区
    int len = 0;                          // 输入流读到缓冲区中的长度
    //3. 将数据从输入流循环读入缓冲区, 当读到文件最后,会得到值-1
    while((len=fis.read(buf))!=-1){
        fos.write(buf,0,len);                   //将读到长度部分写入输出流
    }
    //4. 关闭流
    fis.close();
    fos.close();
}
  • 客户端发数据到服务端


/*
 * TCP传输,客户端建立的过程
 * 1,创建TCP客户端Socket服务,使用的是Socket对象。
 *         建议该对象一创建就明确目的地。要连接的主机。
 * 2,如果连接建立成功,说明数据传输通道已建立。
 *         该通道就是Socket流,是底层建立好的。既然是流,说明这里既有输入,又有输出。
 * 3,使用输出流,将数据写出。
 * 4,关闭资源。
 */
// 建立客户端Socket
Socket s = new Socket(InetAddress.getLocalHost(), 9003);
// 获得输出流
OutputStream out = s.getOutputStream();
// 获得输入流
FileInputStream fis = new FileInputStream("d:\\1\\1.png");
// 发送文件信息
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf)) != -1) {
    // 写入到Socket输出流
    out.write(buf, 0, len);
}
s.shutdownOutput();
// 关流
out.close();
fis.close();
s.close();
  • 服务端
ServerSocket ss = new ServerSocket(9003);// 需要指定端口,客户端与服务端相同,一般在1000-65535之间
//服务端一般一直开启来接收客户端的信息。
while (true) {
    // 获取客户端Socket
    Socket s = ss.accept();
    // 获取输入流与输出流
    InputStream in = s.getInputStream();// 输入流
    FileOutputStream fos = new FileOutputStream("d:\\3\\3.png");
    // 创建缓冲区关联输入流与输出流
    byte[] buf = new byte[1024];
    int len = 0;
    // 数据的写入
    while ((len = in.read(buf)) != -1) {
        fos.write(buf, 0, len);
    }
    // 关流
    fos.close();
    s.close();
}

完整代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        /*
         * 客户端先向服务端发送一个文件名,服务端接收到后给客户端一个反馈,然后客户端开始发送文件
         */
        //建立客户端Socket
        Socket s = new Socket(InetAddress.getLocalHost(), 9001);//修改为服务器IP地址
        //获得输出流
        OutputStream out = s.getOutputStream();
        //关联发送文件
        File file = new File("D:\\1.png");
        String name = file.getName();//获取文件完整名称
        String[] fileName = name.split("\\.");//将文件名按照.来分割,因为.是正则表达式中的特殊字符,因此需要转义
        String fileLast = fileName[fileName.length-1];//后缀名
        //写入信息到输出流
        out.write(name.getBytes());
        //读取服务端的反馈信息
        InputStream in = s.getInputStream();
        byte[] names = new byte[50];
        int len = in.read(names);
        String nameIn = new String(names, 0, len);
        if(!fileLast.equals(nameIn)){
            //结束输出,并结束当前线程
            s.close();
            System.exit(1);
        }
        //如果正确,则发送文件信息
        //读取文件信息
        FileInputStream fr = new FileInputStream(file);
        //发送文件信息
        byte[] buf = new byte[1024];
        while((len=fr.read(buf))!=-1){
            //写入到Socket输出流
            out.write(buf,0,len);
        }
        //关流
        out.close();
        fr.close();
        s.close();
    }
}
  • 服务端 任务类
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Task implements Runnable {
    private Socket s;
    public Task(Socket s){
        this.s = s;
    }
    @Override
    public void run() {
        String ip = s.getInetAddress().getHostAddress();
        try{
            //获取客户端输入流
            InputStream in = s.getInputStream();
            //读取信息
            byte[] names = new byte[100];
            int len = in.read(names);
            String fileName = new String(names, 0, len);
            String[] fileNames = fileName.split("\\.");
            String fileLast = fileNames[fileNames.length-1];
            //然后将后缀名发给客户端
            OutputStream out = s.getOutputStream();
            out.write(fileLast.getBytes());
            //新建文件
            File dir = new File("d:\\server\\"+ip);
            if(!dir.exists())
                dir.mkdirs();
            File file = new File(dir,fileNames[0]+"."+fileLast);
            FileOutputStream fos = new FileOutputStream(file);
            //将Socket输入流中的信息读入到文件
            byte[] bufIn = new byte[1024];
            while((len = in.read(bufIn))!=-1){
                //写入文件
                fos.write(bufIn, 0, len);
            }
            fos.close();
            s.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

服务器类

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args) throws IOException {
        /*
         * 服务端先接收客户端传过来的信息,然后向客户端发送接收成功,新建文件,接收客户端信息
         */
        //建立服务端
        ServerSocket ss = new ServerSocket(9001);//客户端端口需要与服务端一致
        while(true){
            //获取客户端Socket
            Socket s = ss.accept();
            new Thread(new Task(s)).start();
        }
    }
}


相关文章
|
缓存 网络协议 Linux
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
手把手实现tcp/ip用户态协议栈,帮你实践网络知识(网络必备,面试项目)
|
XML 存储 JSON
【面试题精讲】序列化协议对应于 TCP/IP 4 层模型的哪一层?
【面试题精讲】序列化协议对应于 TCP/IP 4 层模型的哪一层?
|
2月前
|
网络协议
TCP/IP与OPC协议的深度比较
总的来说,TCP/IP和OPC协议各有其优点和应用场景。TCP/IP协议是网络通信的基础,而OPC协议则是工业自动化领域的重要工具。在实际应用中,我们需要根据具体的需求和场景,选择合适的协议。
86 11
|
7月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
135 13
|
7月前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
464 3
|
7月前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
8月前
|
网络协议 算法 数据格式
【TCP/IP】UDP协议数据格式和报文格式
【TCP/IP】UDP协议数据格式和报文格式
522 3
|
8月前
|
XML JSON 网络协议
【TCP/IP】自定义应用层协议,常见端口号
【TCP/IP】自定义应用层协议,常见端口号
156 3
|
9月前
|
网络协议 网络架构 数据格式
TCP/IP基础:工作原理、协议栈与网络层
TCP/IP(传输控制协议/互联网协议)是互联网通信的基础协议,支持数据传输和网络连接。本文详细阐述了其工作原理、协议栈构成及网络层功能。TCP/IP采用客户端/服务器模型,通过四个层次——应用层、传输层、网络层和数据链路层,确保数据可靠传输。网络层负责IP寻址、路由选择、分片重组及数据包传输,是TCP/IP的核心部分。理解TCP/IP有助于深入掌握互联网底层机制。
1097 2
|
网络协议 网络架构 数据格式
协议分层与OSI参考模型【图解TCP/IP(笔记三)】
协议分层与OSI参考模型【图解TCP/IP(笔记三)】
268 0
协议分层与OSI参考模型【图解TCP/IP(笔记三)】