java socket之上傳文件


一、功能介紹

該功能主要實現,將客戶端的:F:/work/socketSample/filetemp/client/test_client.txt上傳到服務端F:/work/socketSample/filetemp/server/test_server.txt,並將test_client.txt名字修改為test_server.txt,如果服務端收到文件,則向客戶端發送提示信息”文件已保存至服務器的F:/work/socketSample/filetemp/server/test_server.txt“

二、工程目錄結構

三、服務端

1)Server,服務端主類,監聽端口,有請求將開啟處理子線程

package fileSockeServer;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基於TCP協議的Socket通信,實現文件傳輸-服務器端
 */
public class Server {
    public static void main(String[] args) {
    try {
        // 創建一個服務器端的ServerSocket,綁定並監聽9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        int count = 0;// 記錄客戶端的數量
        System.out.println("服務器啟動,等待客戶端的連接。。。");
        Socket socket = null;
        while (true) {
        // 循環監聽等待客戶端的連接
        socket = serverSocket.accept();
        // 每當一個客戶端連接到服務器,服務器啟動一個單獨的線程處理與此客戶端的通信
        ++count;
        Thread serverHandleThread = new Thread(new ServerHandleThread(socket));
        serverHandleThread.setPriority(4);// 設置線程的優先級[1,10],1為最低,默認是5
        serverHandleThread.start();
        System.out.println("上線的客戶端有" + count + "個!");
        InetAddress inetAddress = socket.getInetAddress();
        System.out.println("當前客戶端的IP地址是:"+ inetAddress.getHostAddress());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}

2)ServerHandleThread,對客戶端的請求進行處理的子線程類

package fileSockeServer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerHandleThread implements Runnable{

    Socket socket = null;// 和本線程相關的Socket
    public ServerHandleThread(Socket socket) {
        super();
        this.socket = socket;
    }
    // 響應客戶端的請求
    @Override
    public void run() {
        // TODO Auto-generated method stub
        OutputStream os = null;
        PrintWriter pw = null;
        try {
            InputStream is=socket.getInputStream();
            // 要完成客戶端文件上傳到服務器的功能需要將客戶機的文件通過FileInputStream進行讀取,並包裝成BufferedInputStream,
            //將套接字的輸出流包裝成BufferedOutputStream,用BufferedInputStream中的read()方法讀取文件中的數據,
            //並用 BufferedOutputStream中的write()方法進行寫入,這樣文件就送入了Socket的輸出流;
            BufferedInputStream bufferedInputStream = new BufferedInputStream(is);// 將BufferedInputStream與套接字的輸入流進行連接
            BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream("F:/work/socketSample/filetemp/server/test_server.txt"));
            byte[] buf=new byte[1024];
            int len=0;
            while((len=bufferedInputStream.read(buf))!=-1){
                bufferedOutputStream.write(buf, 0, len);
            }
            //強行寫入輸出流,因為有些帶緩沖區的輸出流要緩沖區滿的時候才輸出
            bufferedOutputStream.flush();// 刷新緩沖流
            socket.shutdownInput();// 關閉輸入流
            os=socket.getOutputStream();
            pw=new PrintWriter(os);
            pw.println("文件已保存至服務器的F:/work/socketSample/filetemp/server/test_server.txt");
            pw.flush();
            socket.shutdownOutput();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            // 關閉相關資源
            try {
            if (pw != null) {
                pw.close();
            }
            if (os != null) {
                os.close();
            }
            if (socket != null) {
                socket.close();
            }
            } catch (IOException e) {
            e.printStackTrace();
            }
        }
        
    }

}

四、客戶端

1)Client,向服務端發送文件,如果收到服務的反饋信息,將信息打印輸出

package fileSocketClient;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 基於TCP協議的Socket通信,實現文件傳輸-客戶端
 */
public class Client {
    public static void main(String[] args) {
    try {
        // 1.創建客戶端的Socket,指定服務器的IP和端口
        Socket socket = new Socket("127.0.0.1", 9999);
        // 2.獲取該Socket的輸出流,用來向服務器發送文件
        OutputStream os = socket.getOutputStream();
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(os);// 將BufferedOutputStream與套接字的輸出流進行連接      
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("F:/work/socketSample/filetemp/client/test_client.txt"));// 讀取客戶機文件
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = bufferedInputStream.read(buf)) != -1) {
            bufferedOutputStream.write(buf, 0, len);// 向BufferedOutputStream中寫入數據
        }
        bufferedOutputStream.flush();// 刷新緩沖流
        socket.shutdownOutput();// 禁用此套接字的輸出流
        
        // 3.獲取輸入流,取得服務器的信息
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String info = null;
        while ((info = br.readLine()) != null) {
         System.out.println("服務器端的信息:" + info);
        }
        socket.shutdownInput();// 禁用此套接字的輸出流
        // 4.關閉資源
        os.close();
        bufferedInputStream.close();
        bufferedOutputStream.close();
        is.close();
        br.close();
        socket.close();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM