Java基于TCP協(xié)議socket網(wǎng)絡(luò)編程的文件傳送的實(shí)現(xiàn)
先了解一下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),即為套接字
雙方通過(guò)套接字作為一種坐標(biāo),建立信息通道,形成連接(兩點(diǎn)連接一條直線)
簡(jiǎn)單理解了套接字的概念后,來(lái)看看如何通過(guò)java socket編程來(lái)實(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.通過(guò)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ò) 寫(xiě)需要發(fā)送文件的絕對(duì)路徑
FileInputStream fis = new FileInputStream(new File("F:/TEST/1604407051256.jpg"));
//4.字節(jié)文件輸出流 寫(xiě)出文件
byte[] buffer=new byte[1024*10];
int len;
while ((len=fis.read(buffer))!=-1){
//socket編程基于I/O流 所以
//輸出流寫(xiě)轉(zhuǎn)為字節(jié)數(shù)組的文件 =向接收方發(fā)送文件
os.write(buffer,0,len);
}
//通知服務(wù)器我傳送完了 調(diào)用shutdownOutput() 否則影響接下來(lái)代碼執(zhí)行
socket.shutdownOutput();
//確定服務(wù)器接受完畢,斷開(kāi)連接
//獲取接收方響應(yīng)回來(lái)的 接受完畢! 響應(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í)慣 這部分寫(xiě)的簡(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 {
//通過(guò)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ā)送過(guò)來(lái)的 文件通過(guò)文件字節(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í)慣 這部分寫(xiě)的簡(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、接收者指定接受目錄下、查看接收文件存在即為接收成功!
總結(jié):
這個(gè)demo實(shí)現(xiàn)并不是很難,主要考驗(yàn)了我們對(duì)于io流的熟練程度
到此這篇關(guān)于Java基于TCP協(xié)議socket網(wǎng)絡(luò)編程的文件傳送的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java socket文件傳送內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring MVC請(qǐng)求參數(shù)的獲取教程指南
本文介紹了SpringMVC中如何獲取各種類(lèi)型的請(qǐng)求參數(shù),包括基本類(lèi)型、POJO、數(shù)組、集合以及RESTful風(fēng)格的參數(shù),還討論了請(qǐng)求參數(shù)中文亂碼的解決方案,參數(shù)綁定的注解如@RequestParam,以及自定義類(lèi)型轉(zhuǎn)換器的實(shí)現(xiàn),需要的朋友可以參考下2024-10-10
spring boot集成shiro詳細(xì)教程(小結(jié))
這篇文章主要介紹了spring boot 集成shiro詳細(xì)教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
SpringBoot使用Sa-Token實(shí)現(xiàn)路徑攔截和特定接口放行
這篇文章主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)路徑攔截和特定接口放行,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06
SpringBoot實(shí)現(xiàn)Md5對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)加密的示例
本文主要介紹了SpringBoot實(shí)現(xiàn)Md5對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)加密的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
java鏈表應(yīng)用--基于鏈表實(shí)現(xiàn)隊(duì)列詳解(尾指針操作)
這篇文章主要介紹了java鏈表應(yīng)用--基于鏈表實(shí)現(xiàn)隊(duì)列,結(jié)合實(shí)例形式分析了java基于鏈表實(shí)現(xiàn)隊(duì)列尾指針相關(guān)操作使用技巧,需要的朋友可以參考下2020-03-03
通過(guò)反射注解批量插入數(shù)據(jù)到DB的實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于通過(guò)反射注解批量插入數(shù)據(jù)到DB的實(shí)現(xiàn)方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
Java集合中獲取數(shù)據(jù)前驅(qū)和后繼元素的實(shí)現(xiàn)
使用一致性hash時(shí),如何找到一個(gè)hash值對(duì)應(yīng)的臨近節(jié)點(diǎn),可以使用集合中獲取數(shù)據(jù)的前驅(qū)和后繼元素實(shí)現(xiàn),所以本文給大家介紹了Java集合中獲取數(shù)據(jù)前驅(qū)和后繼元素的實(shí)現(xiàn),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-05-05
在SpringMVC框架下實(shí)現(xiàn)文件的上傳和下載示例
本篇文章主要介紹了在SpringMVC框架下實(shí)現(xiàn)文件的上傳和下載示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02

