java Socket文件传输

通常在java Socket编程中,通常会遇到文件传输的情况。文件传输有两种方式字节流和字符流,那么哪些文件用字符流哪些文件用字节流呢?一般的文本文件用字符流,在用字符流的过程中注意在发送方和接收方统一文件的编码;其他类型文件一般采用字节流,可防止文件在传输过程中发生变化。
有时候我们会发现文件经过传输之后发生变化(例如图片损坏,应用程序无法运行等)。查看文件属性,发现文件大小没有变化,但是采用MD5文件校验时发现传输前后md5发生了变化,这通常就是由于采用不正确的传输流造成的。
下面的例子以字节流为例,展示了java Socket文件传输。

//客户端
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
  
public class Client {
     private Socket socket = null ;
     PrintWriter socketWriter = null ;
  
     public void connect() throws UnknownHostException, IOException {
         socket = new Socket( "192.168.1.104" , 8080 );
     }
  
     public void transferFile() throws IOException {
         FileInputStream is = new FileInputStream( "D:\test.exe" );
  
         DataInputStream fiins = new DataInputStream( new BufferedInputStream(is));
         DataOutputStream fileous = new DataOutputStream(socket
                 .getOutputStream());
  
         int n = 512 , m;
         byte buffer[] = new byte [n];
         while ((m = fiins.read(buffer, 0 , n)) != - 1 && m > 0 ) {
             fileous.write(buffer, 0 , m); //这里要注意  读取多少字节 写入多少字节
             fileous.flush();
         }
         fileous.flush();
         fileous.close();
         fiins.close();
         socket.getOutputStream().close();
         socketWriter.close();
     }
}
  
//服务器端代码
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
  
public class Server {
     private ServerSocket server = null ;
     private Socket socket = null ;
      
     public void connect() throws IOException{
         server = new ServerSocket( 8080 , 5 );
         socket = server.accept();
         System.out.println(socket.getInetAddress());
     }
      
     public void getFile() throws IOException{
         InputStream in = socket.getInputStream();
         File file = new File( "E:\\text.exe" );
          
          
         DataInputStream fileStream = new DataInputStream(in);
         FileOutputStream os = new FileOutputStream(file);
         DataOutputStream out = new DataOutputStream(os);
          
         int n = 512 ,m;
         byte buffer[] = new byte [n];
         while (((m=fileStream.read(buffer, 0 , n))!=- 1 ) && (m> 0 )){
             out.write(buffer, 0 ,m);
         }
         out.close();
         in.close();
         os.close();
         System.out.println( "ok" );
         socket.close();
         server.close();
     }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值