socket实现简单文件传输系统

用java实现一个采用用户自定义协议的文件传输服务器FileServer。当FileClient发送请求“GET xxx.xxx”时,FileServer就把xxx.xxx文件发送给FileClient;当FileClient发送请求”PUT xxx.xxx“时,FileServer就把文件xxx.xxx保存在服务端。
FileServer.java

package learn;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class FileServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket();
        serverSocket.setReuseAddress(true);
        serverSocket.bind(new InetSocketAddress("localhost", 8346));
        while (serverSocket.isBound() && !serverSocket.isClosed()) {
            new Thread(new Handle(serverSocket.accept())).start();
        }
    }
}

class Handle implements Runnable {
    private Socket socket;

    public Handle(Socket socket) {
        super();
        this.socket = socket;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            boolean isRead = false, isSave = false;
            String fileName;
            {
                InputStream in = socket.getInputStream();
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                int p;
                while ((p = in.read()) != -1) {
                    if ((p == '\r' && (p = in.read()) == '\n')) {
                        break;
                    }
                    out.write(p);
                }
                {
                    String str = new String(out.toByteArray());
                    System.out.println(str);
                    String[] s = str.split(" ");
                    if (s[0].equals("GET")) {
                        isRead = true;
                    } else if (s[0].equals("PUT")) {

                    }
                    fileName = s[1];
                }
            }
            if (isRead) {
                InputStream in = new FileInputStream(new File("E:/" + fileName));
                OutputStream out = socket.getOutputStream();
                int p;
                while ((p = in.read()) != -1) {
                    out.write(p);
                }
            } else if (isSave) {
                OutputStream out = new FileOutputStream(new File("E:/" + fileName));
                InputStream in = socket.getInputStream();
                int p;
                while ((p = in.read()) != -1) {
                    if ((p == '\r' && (p = in.read()) == '\n')) {
                        break;
                    }
                    out.write(p);
                }
            }
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

FileClient.java

package learn;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class FileClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        // 写入测试
        {
            Socket socket = new Socket("localhost", 8346);
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("PUT a.txt\r\n".getBytes());
            outputStream.write("今天心情不错!".getBytes());
            socket.close();
        }
        // 读取测试
        {
            Socket socket = new Socket("localhost", 8346);
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("GET a.txt\r\n".getBytes());
            InputStream inputStream = socket.getInputStream();
            outputStream = new ByteArrayOutputStream();
            int p;
            while ((p = inputStream.read()) != -1) {
                outputStream.write(p);
            }
            System.out.println(new String(((ByteArrayOutputStream) outputStream).toByteArray()));
            socket.close();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u014314578/article/details/50428333