溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Java項(xiàng)目中利用socket網(wǎng)絡(luò)編程實(shí)現(xiàn)一個(gè)文件傳送功能

發(fā)布時(shí)間:2020-12-04 15:03:23 來源:億速云 閱讀:360 作者:Leah 欄目:開發(fā)技術(shù)

如何在Java項(xiàng)目中利用socket網(wǎng)絡(luò)編程實(shí)現(xiàn)一個(gè)文件傳送功能?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

先了解一下socket基本概念

socket也叫套接字:

是指在網(wǎng)路中不同主機(jī)上的應(yīng)用進(jìn)程之間,進(jìn)行雙向通信的端點(diǎn)的抽象。

簡(jiǎn)單理解就是:

兩個(gè)主機(jī)之間要通信,就需要知道彼此的ip,端口號(hào)等信息,而一臺(tái)主機(jī)這些信息的集合:

就可以理解為一個(gè)端點(diǎn),即為套接字

雙方通過套接字作為一種坐標(biāo),建立信息通道,形成連接(兩點(diǎn)連接一條直線)

簡(jiǎn)單理解了套接字的概念后,來看看如何通過java socket編程來實(shí)現(xiàn)

兩臺(tái)主機(jī)文件的接收與發(fā)送:

代碼如下:

發(fā)送方:

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


/**
 * 發(fā)送者
 */
public class TcpSendCilent {
 public static void main(String[] args) throws Exception {
  //1.通過socket對(duì)象 創(chuàng)建socket連接
  Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
  //2,創(chuàng)建一個(gè)字節(jié)輸出流
  OutputStream os = socket.getOutputStream();
  //3.字節(jié)文件輸入流 讀取文件
  //避免出錯(cuò) 寫需要發(fā)送文件的絕對(duì)路徑
  FileInputStream fis = new FileInputStream(new File("F:/TEST/1604407051256.jpg"));
  //4.字節(jié)文件輸出流 寫出文件
  byte[] buffer=new byte[1024*10];
  int len;
  while ((len=fis.read(buffer))!=-1){
   //socket編程基于I/O流 所以
   //輸出流寫轉(zhuǎn)為字節(jié)數(shù)組的文件 =向接收方發(fā)送文件
   os.write(buffer,0,len);
  }
  //通知服務(wù)器我傳送完了 調(diào)用shutdownOutput() 否則影響接下來代碼執(zhí)行
  socket.shutdownOutput();

  //確定服務(wù)器接受完畢,斷開連接
  //獲取接收方響應(yīng)回來的 接受完畢! 響應(yīng)
  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,0,len2);
  }
  //顯示接收方的響應(yīng)
  System.out.println(baos.toString());

  //發(fā)送結(jié)束后,最后關(guān)閉所有資源
  //關(guān)閉資源好習(xí)慣 這部分寫的簡(jiǎn)單
  //一般建議先進(jìn)行一個(gè)非空判斷再關(guān)閉
  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對(duì)象 創(chuàng)建接收端套接字
  ServerSocket serverSocket=null;
  //套接字
  Socket socket=null;
  //字節(jié)輸入流
  InputStream in=null;

  //默認(rèn)參數(shù)定義端口號(hào) 發(fā)送方依據(jù)這個(gè)端口號(hào)發(fā)送
  serverSocket=new ServerSocket(9000);
  socket = serverSocket.accept();
  //socket對(duì)象 獲取輸入流,拿到文件
  in = socket.getInputStream();

  //將發(fā)送者發(fā)送過來的 文件通過文件字節(jié)輸出流 輸出到指定路徑下
  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,0,len);
  }

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

  outputStream.write("我是文件接收者:我已成功接受".getBytes());
  //接受結(jié)束后,關(guān)閉資源好習(xí)慣 這部分寫的簡(jiǎn)單
  //一般建議先進(jìn)行一個(gè)非空判斷再關(guān)閉
  fos.close();
  serverSocket.close();
  socket.close();
  in.close();
 }
}

測(cè)試方法:

以上代碼可直接粘貼測(cè)試
1、先運(yùn)行接收者等待接受,

2、再運(yùn)行發(fā)送者,

3、等待接收者向發(fā)送者響應(yīng): 我是文件接收者:我已成功接受;

4、接收者指定接受目錄下、查看接收文件存在即為接收成功!

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI