一个JAVA编写的TCP上传文件程序

编写客户端的代码:

创建将要上传的文件读入客户端内存的流对象

FileInputStream fis = new FileInputStream("D:\\Music1.mp3");
        
BufferedInputStream bis = new BufferedInputStream(fis);

创建客户端套接字对象(构造方法中传入的是服务端的IP地址和端口号)

Socket cs = new Socket("192.168.1.105",33333);

获取输出流对象(多态形式)

OutputStream os = cs.getOutputStream();

BufferedOutputStream bos = new BufferedOutputStream(os);

定义缓冲数组(length用于记录从文件冲读取的字节数)

byte[] buffer = new byte[64];
int length = 0;

利用循环读取文件中的字节并发送给服务端

while((length = bis.read(buffer))!=-1) {
  bos.write(buffer,0,length);
}

告知服务端传输完毕

cs.shutdownOutput();

接收服务端发来的反馈信息:

InputStream is = cs.getInputStream();
        
        byte[] buffer2 = new byte[64];
        int length2 = is.read(buffer2);
        System.out.println(new String(buffer2,0,length2));
        

关闭资源:(关闭资源的时候可能会报错:套接字在另一个方向已关闭,将向服务端的输出流关闭的代码去掉即可)

     
is.close();
bis.close(); cs.close(); //bos.close();

编写服务端的代码:

创建服务端套接字对象(指定监视的端口号):

ServerSocket ss = new ServerSocket(33333);

获取服务端的套接字对象

Socket cs = ss.accept();

获取输入流对象,并利用缓冲流提升效率

InputStream is = cs.getInputStream();
        
BufferedInputStream bis = new BufferedInputStream(is);

创建输出流对象,指定上传后的文件位置,这里不能写死,所以可以根据当前系统时间命名文件

String filename = Long.toString(System.currentTimeMillis());
        
        filename = filename.substring(filename.length()-12, filename.length());
        
        FileOutputStream fos = 
                new FileOutputStream("d:\\upload\\"+filename);
        
        BufferedOutputStream bos = new BufferedOutputStream(fos);

利用循环将来自客户端的字节写入服务端输出流中

int length = 0;
        
        while((length = bis.read())!=-1) {
            bos.write(buffer,0,length);
        }

传输完毕,服务端提示一下

System.out.println(cs.getInetAddress()+"上传了一个新文件!");

再通知客户端文件上传成功(需要新建一个输出流)

OutputStream os = cs.getOutputStream();
        
        os.write(("文件上传成功,用时"+(time2-time1)/1000.0+"秒").getBytes());

关闭各种资源:

os.close();
        bos.close();
        bis.close();
        cs.close();
        ss.close();

运行效果:

 

 

posted @ 2021-03-02 22:22  lucascube  阅读(117)  评论(0)    收藏  举报