使用TCP通信的知识,编写一个文件上传的程序

先写服务器端,必须先执行服务器端。这个是在本机的,所以IP地址使用的是127.0.0.1。如果服务器不是本机,修改服务器的IP地址即可。

package wangluobiancheng;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/*
 * TCP通信两端需要创建socket对象
 * 使用TCP通信的知识,编写一个文件上传的程序,完成将本地计算机F盘中的1.jpg文件上传到F盘中名称为upload的文件夹中,
 * 要求把客户端的IP地址加上count标识作为上传后的文件名。即IP(count)的形式,其中,count随着重命名文件的增多而增大,如127.0.0.1(1).jpg,127.0.0.1(2).jpg
 * 需要一个服务器端接受文件,需要一个客户端上传文件
 */
public class FileServer {

    public static void main(String[] args) throws Exception {
//        创建ServerSocket对象,端口号为10001
        ServerSocket ssk = new ServerSocket(10001);
        while(true) {
//            调用accept()方法接受客户端请求,得到Socket对象
            Socket sk = ssk.accept();
//            每当和客户端建立Socket连接后,单独开启一个线程处理和客户端的交互
            new Thread(new ServerThread(sk)).start();
        }
    }
}
/*
 * 编写服务器端程序来接受图片,服务器端用ServerSocket对象的accept()方法接受客户端请求,
 * 由于一个服务器可能对应多个客户端,所以当客户端与服务器端建立连接后,服务器端需要单独开启一个新的线程来处理和客户端的交互,这时需要在服务器端编写开启新线程的方法
 * 在新线程中,需要获得客户端的端口号,并且使用输入输出流来传输图片到指定目录中
 */
class ServerThread implements Runnable{//服务器端开启新线程
    private Socket sk2;//持有一个Socket类型的属性
    public ServerThread(Socket sk) {//构造方法中把Socket对象作为实参传入
        this.sk2 = sk;
    }
    @Override
    public void run() {
//        获取客户端的IP地址
        String ip = sk2.getInetAddress().getHostAddress();
        int count = 1;//上传图片个数,初始值为1,往后每多上传一个,就加一
        try {
            InputStream in = sk2.getInputStream();//创建输入流对象in,输入是对程序而言
//            创建上传图片目录的File对象,文件位置本来一个“\”就可以了,但是java为了和转义字符区分开,用\\
            File parentFile = new File("F:\\upload\\");
//            如果不存在,就创建这个目录
            if(!parentFile.exists()) {
                parentFile.mkdir();
            }
//            把客户端的IP地址作为上传文件的文件名
            File file = new File(parentFile,ip+"("+count+").jpg");
            while(file.exists()) {
//                如果文件名存在,则把count++
                file = new File(parentFile,ip+"("+count+").jpg");
            }
//            创建FileOutputStream对象,文件输出对象,输出是对程序而言
            FileOutputStream fos = new FileOutputStream(file);
            byte[] buf = new byte[1024];
            int len = 0;//定义一个int类型的变量len,初始值为0
            while((len = in.read(buf))!=-1) {//循环读取数据,接收文件读取输入,存入buf,同时读取的个数赋值给len;
                fos.write(buf,0,len);//将读取到的内容输出给File指定的文件
            }
            OutputStream out = sk2.getOutputStream();//获取服务端的输出流,向客户端输出
            out.write("上传成功".getBytes());//上传成功后向客户端写出“上传成功”。
            fos.close();//关闭输出流对象
            sk2.close();//关闭Socket对象
        }catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
}

然后再写文件上传的客户端,(即再写一个JAVA文件)

package wangluobiancheng;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class FileClient {
    public static void main(String[] args) throws Exception {
//        IP地址使用"127.0.0.1"是因为服务器在本机,端口号和服务器提供的一致
        Socket s = new Socket("127.0.0.1",10001);//创建客户端Socket
        OutputStream out = s.getOutputStream();//获取Socket的输出流对象
//        创建FileInputStream对象,文件的输入流对象,输入输出都是对程序而言的
        FileInputStream fis = new FileInputStream("F:\\1.jpg");
        byte[] buf = new byte[1024];//定义一个字节数组
        int len ;//定义一个int类型的变量len
        while((len = fis.read(buf))!=-1) {//循环读取数据
            out.write(buf,0,len);//向服务器端输入
        }
        s.shutdownOutput();//关闭客户端输出流
        InputStream in = s.getInputStream();//获取客户端的输入流对象,是服务器端传过来的
        byte[] bufMsg = new byte[1024];
        int num = in.read(bufMsg);//接受服务端的信息
        String Msg = new String(bufMsg,0,num);
        System.out.println(Msg);
        fis.close();
        s.close();
    }
}

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(使用TCP通信的知识,编写一个文件上传的程序,使用TCP通信的知识,编写一个文件上传的程序)