簡體   English   中英

如何使用套接字將文件從服務器端傳輸到客戶端?

[英]How can I transfer files from Server-Side to Client using Sockets?

我在哪里開始執行此任務時遇到了麻煩,我想要一些示例或輸入內容,說明如何設置服務器/客戶端組件以接收和發送數據,包括讓客戶端下載圖像。

這是我的客戶端代碼:

package V3;

import java.io.*;
import java.net.*;

public class Version3Client {
    public static void main(String[] args) throws IOException {

        Socket kkSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            kkSocket = new Socket("localhost", 4444);
            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: taranis.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String fromServer;
        String fromUser;

        while ((fromServer = in.readLine()) != null) {
            System.out.println("Server: " + fromServer);
            if (fromServer.equals("Bye."))
                break;

            fromUser = stdIn.readLine();
        if (fromUser != null) {
                System.out.println("Client: " + fromUser);
                out.println(fromUser);
        }
        }

        out.close();
        in.close();
        stdIn.close();
        kkSocket.close();
    }
}

這是我的服務器端代碼:

package V3;

import java.net.*;
import java.io.*;

public class Version3Server {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;
        boolean listening = true;

        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(-1);
        }

        while (listening)
        new Version3ServerThread(serverSocket.accept()).start();

        serverSocket.close();

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                clientSocket.getInputStream()));
        String inputLine, outputLine;
        Version3Protocol kkp = new Version3Protocol();

        outputLine = kkp.processInput(null);
        out.println(outputLine);

        while ((inputLine = in.readLine()) != null) {
             outputLine = kkp.processInput(inputLine);
             out.println(outputLine);
             if (outputLine.equals("Bye."))
                break;
        }
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}

添加了線程類以進一步規范:

package V3;
    import java.net.*;
    import java.io.*;
    import java.io.FileWriter;

    public class Version3ServerThread extends Thread {
        private Socket socket = null;

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

        public void run() {

        try {
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                        socket.getInputStream()));

            String inputLine, outputLine;
            Version3Protocol kkp = new Version3Protocol();
            outputLine = kkp.processInput(null);
            out.println(outputLine);

            while ((inputLine = in.readLine()) != null) {
            outputLine = kkp.processInput(inputLine);
            out.println(outputLine);
            if (outputLine.equals("Bye"))
                break;
                    if(kkp.getInteraction()){
                      Logging.writeToFile(socket.getInetAddress());
                    }
            }
            out.close();
            in.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        }
    }

到目前為止的代碼,沒有文件傳輸能力的客戶機/服務器通信,對我來說還不錯。 我想編譯以查找任何錯誤,但您沒有包括Version3Protocol和Logging。 如果可以編譯,則下一步是使用FileInputStream打開要在服務器上傳輸的文件,並使用FileOutputStream在客戶端上寫入新文件:

http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileInputStream.html http://download.oracle.com/javase/1.4.2/docs/api/java/io /FileOutputStream.html

然后,您可以將文件讀入緩沖區,使用套接字傳輸它,在客戶端接收它,然后將緩沖區內容復制到FileOutputStream中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM