TCP通信---文件上传案例、多线程文件上传

目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用TCP协议来实现。

TCP通信需要创建一个服务器端程序和一个客户端程序,实现客户端向服务器端上传文件

代码实例:

l 首先编写服务器端程序,用来接收图片。

//服务器端
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //明确端口号
        ServerSocket server=new ServerSocket(9999);
        //建立连接
        Socket socket=server.accept();
                 //显示哪个客户端Socket连接上了服务器
        InetAddress ipObject = server.getInetAddress();//得到IP地址对象
        String ip = ipObject.getHostAddress(); //得到IP地址字符串
        System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);
        //明确数据源,获取Socket的输入流
        InputStream in=socket.getInputStream();
        //明确目的地
        File file=new File("e:\haizei");
        //判断文件是否存在
        if(!file.exists()){
            file.mkdirs();
        }
        //创建接收文件名称(避免重复):域名+毫秒值+3位随机数
        String filename="oracle"+System.currentTimeMillis()+(Math.random()*9+1)*100+".jpg";
        FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
        //开始复制
        int len=0;
        byte[] bytes=new byte[1024];
        while((len=in.read(bytes))!=-1){
            fos.write(bytes, 0, len);
        }
        //回复客户端
        OutputStream out=socket.getOutputStream();
        out.write("上传成功".getBytes());
        //释放资源
        fos.close();
        server.close();
        
    }
}

l 编写客户端,完成上传图片

//客户端
public class TCPClient {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",8000);
        OutputStream out=socket.getOutputStream();
        FileInputStream fis=new FileInputStream("d:\haizei.jpg");
        int len=0;
        byte[] bytes=new byte[1024];
        while ((len=fis.read(bytes))!=-1) {
            out.write(bytes,0,len);
            
        }
        //传输的是字符数组,没有结束符,不能读取-1,要添加结束方法
        //告诉服务器端,不要再读了,到末尾了
        socket.shutdownOutput();
        //服务器回复
        InputStream in=socket.getInputStream();
        len=in.read(bytes);
        System.out.println(new String(bytes,0,len));
        //释放资源
        fis.close();
        socket.close();
    }
}

文件上传案例多线程版本

实现服务器端可以同时接收多个客户端上传的文件。

l 我们要修改服务器端代码

public class UPload implements Runnable{
    private Socket socket;
    
    public  UPload(Socket socket){
        this.socket=socket;
    }
    public void run() {
        FileOutputStream fos=null;
        try{
            InetAddress ipObject = socket.getInetAddress();//得到IP地址对象
            String ip = ipObject.getHostAddress(); //得到IP地址字符串
            System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);
        //明确数据源
        InputStream in=socket.getInputStream();
        //明确目的地
        File file=new File("e:\haizei");
        //判断文件是否存在
        if(!file.exists()){
            file.mkdirs();
        }
        //域名+毫秒值+6位随机数
        String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(999)+".jpg";
        fos=new FileOutputStream(file+File.separator+filename);
        //开始复制
        int len=0;
        byte[] bytes=new byte[1024];
        while((len=in.read(bytes))!=-1){
            fos.write(bytes, 0, len);
        }
        //回复客户端
        OutputStream out=socket.getOutputStream();
        out.write("上传成功".getBytes());
        }catch(IOException ex){
            ex.printStackTrace();
        }finally{
            //释放资源
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        

创建实验类

public class Demo {
    public static void main(String[] args) throws IOException {
        //明确端口号
        ServerSocket server =new ServerSocket(8000);
         //死循环,不断创建线程
        while(true){
            //接收客户端
            Socket socket=server.accept();
            //匿名对象,创建线程
            new Thread(new UPload(socket)).start();
        }        
    }
}
原文地址:https://www.cnblogs.com/dk2557/p/9558989.html