您好,登錄后才能下訂單哦!
如何在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ì)億速云的支持。
免責(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)容。