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 {
    privateSocket socket = null;
    PrintWriter socketWriter =null;
  
    publicvoid connect() throws UnknownHostException, IOException {
        socket =new Socket("192.168.1.104",8080);
    }
  
    publicvoid transferFile() throws IOException {
        FileInputStream is =new FileInputStream("D:\test.exe");
  
        DataInputStream fiins =new DataInputStream(newBufferedInputStream(is));
        DataOutputStream fileous =new DataOutputStream(socket
                .getOutputStream());
  
        intn = 512, m;
        bytebuffer[] = 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 {
    privateServerSocket server = null;
    privateSocket socket = null;
      
    publicvoid connect() throws IOException{
        server =new ServerSocket(8080,5);
        socket = server.accept();
        System.out.println(socket.getInetAddress());
    }
      
    publicvoid 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);
          
        intn = 512,m;
        bytebuffer[] = 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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值