Socket服务端和客户端文件传输

很多朋友在使用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();

    }
}

写的比较好的相关文章:https://blog.csdn.net/hlhakey/article/details/47030295

你可能感兴趣的:(Socket)