天天看点

TCP客户端上传任意文件至服务端3.服务端引入库4.服务端代码总结

1.客户端引入库

代码如下(示例):

package TCP_and_UDP;
import java.io.*;
import java.net.Socket;
           

2.客户端代码

代码如下(示例):

public class Client {
    private static final int SIZE = 1024*1024;
    public static void main(String[] args) throws IOException {
        in();
    }

    public static void in() throws IOException {

        //创建缓冲区存储从键盘录入的信息,主要是一整行一整行地读
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        //获取文件路径
        System.out.println("请输入文件所在的目录以及文件名称,以回车键结束(例如:G:\\IdeaProjects\\untitled\\一路向北.mp3)");
        String dir = bufr.readLine();
        //获取文件类型
        System.out.println("请输入上传的文件类型,以回车键结束(例如:.mp3)");
        String name = bufr.readLine();
        //获取IP地址
        System.out.println("请输入你要上传的IP地址,以回车键结束");
        String ip = bufr.readLine();

        //关闭资源
        bufr.close();

        //调用运行客户端所在的方法,并将文件路径,文件类型和IP地址作为参数传入
        free(dir,ip,name);
    }

    public static void free(String dir,String ip,String name) throws IOException {

        //创建Socket对象,这是必须要做的,因为客户端和服务端就是靠这个连接,10005为端口号
        //不建议使用1024以内的端口号
        Socket s = new Socket(ip,10005);

        //读取客户端要上传的文件
        FileInputStream bufi = new FileInputStream(dir);

        //将读到的文件数据发送给服务端
        PrintStream out = new PrintStream(s.getOutputStream(),true);

        //将文件类型告诉服务器,以便于生成对应类型的文件
        PrintWriter out1 = new PrintWriter(s.getOutputStream(),true);
        out1.println(name);

        //创建数组存储读到的文件的字节信息
        byte[] buf = new byte[SIZE];

        int len = 0;
        while((len = bufi.read(buf))!=-1)
        {
            //将读到的数据传给服务器端
           out.write(buf,0,len);

        }


        //告知服务端数据发送完毕,让服务端停止读取,否则服务端将一直等待读取
        s.shutdownOutput();

        //读取服务端发回来的应答消息,这里用缓冲区是不想创建一个数组了
        BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));

        //这里没有加while语句是因为已经知道应答消息只有:上传成功,所以不需要,但为了严谨,根据需求添加
        String str = bufr.readLine();
        //输出从服务端获取的应答消息
        System.out.println(str);

        //关流,关闭资源,PrintStream和PrintWriter会随着Socket的关闭而关闭
        s.close();
        bufi.close();
        bufr.close();


    }
           

3.服务端引入库

package TCP_and_UDP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
           

4.服务端代码

public class Server {
    private static final int SIZE = 1024*1024;
    public static void main(String[] args) throws IOException {

        free();

    }

    public static void free() throws IOException {

        //创建服务器端ServerSocket对象,客户端和服务器端的端口必须一致才能进行连接
        ServerSocket ss = new ServerSocket(10005);

        //获取连接进来的客户端Socket对象......这里可能说得不对
        Socket s = ss.accept();
        //打印连接进来的客户端的IP,并且打印是否连接成功
        System.out.println(s.getInetAddress().getHostAddress()+".......连接成功");

        //从流中读取客户端发来的数据
        InputStream  in = s.getInputStream();

        //这个是从流中获取文件的类型,因为是用字符流传过来的是字符串,所以用字符流
        BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String name = bufr.readLine();

        //创建文件
        FileOutputStream fos = new FileOutputStream("server"+name);

        byte[] buf = new byte[SIZE];

        int len = 0;

        while((len = in.read(buf))!=-1)
        {
            //将数据写入文件
            fos.write(buf,0,len);
            fos.flush();
        }

        //创建PrintWriter对象,告诉客户端文件上传成功
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        out.println("上传成功");

        //关闭资源
        s.close();
        ss.close();
        fos.close();

    }
           

总结

以上就是全部内容,本文仅仅粗略地实现了客户端向服务端上传文件,

每次只能上传一个文件,如果需要同时上传多个文件,就需要运用到多线程任务来实现,可能有些地方的解释不对,以及有一些地方浪费了资源,也就是有更好的方式,还希望路过的大佬能够指出,谢谢大佬!!!!