基於TCP用JAVA實現客戶端和服務端通信


案例模型分析:

基於TCP實現,一個Clinet(發送端)向,一個Server(接收端)上傳圖片文件的功能。要求,客戶端上上傳的圖片路徑,需要從配置文件.properties文件中讀取

為了簡化並可視結果:客戶端和服務端,用本機ip上兩個端口模擬即可;

定義Socket的時候,本機端口是OS隨機分配的;

發送的文件類型是圖片,用字節流(圖片可能很大,這里用緩沖流包裝)

由於服務器端套接字輸入流是一個阻塞方法,客戶端發送完數據后,需要用shutdown方法關閉客戶端套接字輸出流,這樣服務端就不會一直阻塞等待新的輸入;

 

客戶端:

package netTCP;

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

public class Clinet {

    public static void main(String args[]) throws IOException {
        //獲取文本內容,得到目標文件的路徑
        String filepathtoUpload = getPath();
        System.out.println("獲得要上傳的文件所在路徑是: "+filepathtoUpload);

        //定義客戶端端口(目的ip,目的端口)
        Socket socket = new Socket("127.0.0.1",9991);

        //定義緩沖輸入流,准備讀入圖片的字節緩沖數組
        BufferedInputStream bi = new BufferedInputStream(new FileInputStream(filepathtoUpload));
        byte[] buffpic= new byte[1024];
        int len;

        //獲取客戶端發送流,做包裝;一邊讀圖片字節數據,一邊發送
        OutputStream out = socket.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        while((len = bi.read(buffpic))!=-1){
            bos.write(buffpic,0,len);
        }
        bos.flush();//刷新緩存
        socket.shutdownOutput();//禁用此套接字的輸出流,可以使服務器端的InputStream不在阻塞

        //獲取客戶端輸入流,接受文件上傳后反饋信息
        InputStream in = socket.getInputStream();
        byte [] feedBack = new byte[1024];
        int lenfeedBack = in.read(feedBack);
        System.out.println(new String(feedBack,0,lenfeedBack));

        //收到反饋信息后,關閉套接字socket
        socket.close();
        bi.close();
    }


    public static String getPath() throws IOException {
        FileInputStream fileInputStream = new FileInputStream("G:\\JavaTestDir\\路徑有中文\\config.properties");
        byte[] buffer = new byte[1024];
        int len = fileInputStream.read(buffer);
        String s = new String(buffer,0,len);
        return s;

    }

}

服務端:

package netTCP;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
   public static void main(String args[]) throws IOException {
       //定義服務端SeverSocker,並獲取服務端連接的socket
       ServerSocket serverSocket = new ServerSocket(9991);
       Socket socket = serverSocket.accept();

       //獲取socket輸入流,並用緩存字節流包裝;
       InputStream in = socket.getInputStream();
       BufferedInputStream bis = new BufferedInputStream(in);

       //指定一個路徑(這里用默認路徑),定義緩沖輸出流,用於將圖片保存到默認路徑
       FileOutputStream fo = new FileOutputStream("copy.jpg");
       BufferedOutputStream bos = new BufferedOutputStream(fo);

       //接收客戶端的數據,並寫到指定位置
       byte[] buff = new byte[1024];
       int len = 0;
       while((len = bis.read(buff))!=-1){
            bos.write(buff,0,len);
       }
        bos.flush();

       //獲取socket輸出流
       OutputStream out = socket.getOutputStream();
       //返回文件上傳結束信息給客戶端(中文)
       String feedbackMessage ="文件上傳結束";
       out.write(feedbackMessage.getBytes());

       //out.close();//可不用,由客戶端關閉socket即可
       fo.close();
      // in.close();//可不用,有客戶端關閉socket即可
       socket.close();
       serverSocket.close();;
   }

}

可以看到運行完,圖片被上傳到默認路徑




免責聲明!

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



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