1. 程式人生 > 程式設計 >Java基於TCP協議socket網路程式設計的檔案傳送的實現

Java基於TCP協議socket網路程式設計的檔案傳送的實現

先了解一下socket基本概念

socket也叫套接字:

是指在網路中不同主機上的應用程序之間,進行雙向通訊的端點的抽象。

簡單理解就是:

兩個主機之間要通訊,就需要知道彼此的ip,埠號等資訊,而一臺主機這些資訊的集合:

就可以理解為一個端點,即為套接字

雙方通過套接字作為一種座標,建立資訊通道,形成連線(兩點連線一條直線)

簡單理解了套接字的概念後,來看看如何通過java socket程式設計來實現

兩臺主機檔案的接收與傳送:

程式碼如下:

傳送方:

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


/**
 * 傳送者
 */
public class TcpSendCilent {
 public static void main(String[] args) throws Exception {
  //1.通過socket物件 建立socket連線
  Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
  //2,建立一個位元組輸出流
  OutputStream os = socket.getOutputStream();
  //3.位元組檔案輸入流 讀取檔案
  //避免出錯 寫需要傳送檔案的絕對路徑
  FileInputStream fis = new FileInputStream(new File("F:/TEST/1604407051256.jpg"));
  //4.位元組檔案輸出流 寫出檔案
  byte[] buffer=new byte[1024*10];
  int len;
  while ((len=fis.read(buffer))!=-1){
   //socket程式設計基於I/O流 所以
   //輸出流寫轉為位元組陣列的檔案 =向接收方傳送檔案
   os.write(buffer,len);
  }
  //通知伺服器我傳送完了 呼叫shutdownOutput() 否則影響接下來程式碼執行
  socket.shutdownOutput();

  //確定伺服器接受完畢,斷開連線
  //獲取接收方響應回來的 接受完畢! 響應
  InputStream inputStream = socket.getInputStream();
  ByteArrayOutputStream baos=new ByteArrayOutputStream();
  byte[] bytes2=new byte[1024*10];
  int len2;
  while ((len2=inputStream.read(bytes2))!=-1){
    baos.write(bytes2,len2);
  }
  //顯示接收方的響應
  System.out.println(baos.toString());

  //傳送結束後,最後關閉所有資源
  //關閉資源好習慣 這部分寫的簡單
  //一般建議先進行一個非空判斷再關閉
  baos.close();
  fis.close();
  os.close();
  socket.close();

 }
}

接收方:

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

/**
 * 接收端
 */
public class TcpAcceptServer {
 public static void main(String[] args) throws IOException {
  //通過ServerSocket物件 建立接收端套接字
  ServerSocket serverSocket=null;
  //套接字
  Socket socket=null;
  //位元組輸入流
  InputStream in=null;

  //預設引數定義埠號 傳送方依據這個埠號傳送
  serverSocket=new ServerSocket(9000);
  socket = serverSocket.accept();
  //socket物件 獲取輸入流,拿到檔案
  in = socket.getInputStream();

  //將傳送者傳送過來的 檔案通過檔案位元組輸出流 輸出到指定路徑下
  FileOutputStream fos = new FileOutputStream(new File("F:/recevice.jpg"));
  int len;
  byte[] bytes=new byte[1024*10];
  while ((len=in.read(bytes))!=-1){
    fos.write(bytes,len);
  }

  //通知傳送者接受完畢了
  OutputStream outputStream = socket.getOutputStream();

  outputStream.write("我是檔案接收者:我已成功接受".getBytes());
  //接受結束後,關閉資源好習慣 這部分寫的簡單
  //一般建議先進行一個非空判斷再關閉
  fos.close();
  serverSocket.close();
  socket.close();
  in.close();
 }
}

測試方法:

以上程式碼可直接貼上測試
1、先執行接收者等待接受,

2、再執行傳送者,

3、等待接收者向傳送者響應: 我是檔案接收者:我已成功接受;

4、接收者指定接受目錄下、檢視接收檔案存在即為接收成功!

總結:

這個demo實現並不是很難,主要考驗了我們對於io流的熟練程度

到此這篇關於Java基於TCP協議socket網路程式設計的檔案傳送的實現的文章就介紹到這了,更多相關Java socket檔案傳送內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!