很多朋友在使用socket编程时不可避免的都做过文件传输,而视频电影等需要一个字节一个字节的传输;
但是客户端一般都通过-1进行终止,服务也一样;但是存在的问题是客户端永远不会把-1传递给服务端;
因此经常会遇到服务端卡死报错;所以在传输时先把文件接收标示传递给服务端,比如文件长度,或者终止字符等
Server:
public class Server { public static void main(String[] args) throws Exception { ServerSocket server =new ServerSocket(8888); Socket client =server.accept(); DataInputStream dis =new DataInputStream(client.getInputStream()); long size =dis.readLong(); String fileName =dis.readUTF(); System.out.println("文件大大小为:"+size+",文件名为:"+fileName); String dir ="D:/tmp/"; File dest =new File(dir+fileName); BufferedInputStream bis =new BufferedInputStream(client.getInputStream()); BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream(dest)); long readSize =0; while(true){ if (readSize > size) { break; } int data =bis.read(); bos.write(data); readSize++; } System.out.println("上传完毕"); bos.flush(); } }
Client:
public class Client { public static void main(String[] args) throws Exception { Socket client =new Socket("localhost",8888); File src =new File("D:/spark-1.6.1-bin-hadoop2.6.tgz"); String name =src.getName(); long size =src.length(); DataOutputStream dos =new DataOutputStream(client.getOutputStream()); dos.writeLong(size); dos.writeUTF(name); dos.flush(); BufferedInputStream bis =new BufferedInputStream(new FileInputStream(src)); BufferedOutputStream bos =new BufferedOutputStream(client.getOutputStream()); long writeSize =0; while(true){ bos.write(bis.read()); writeSize++; if(writeSize>size){ break; } } bos.flush(); } }
运行方式:
先启动server 再启动client
打印结果
文件大大小为:289405702,文件名为:spark-1.6.1-bin-hadoop2.6.tgz
上传完毕