利用TCP 客戶端---->服務端 傳送文件到指定路徑,並返回一個友好的回饋

来源:http://www.cnblogs.com/gode/archive/2016/08/25/5808618.html
-Advertisement-
Play Games

首先盲寫的一個傳輸文件的方法,但測試發現了一個非常不容易發現的問題,這裡先說明一下。 錯誤的代碼如下: 有看出來問題麽,沒有,看著一點問題也沒有,但執行的時候就是報錯,而且報錯的位置著實很頭痛,在那附近找了很久也沒找到...... 下麵是所報Error的信息 指定的位置是35行寫入的問題,但是找了很 ...


首先盲寫的一個傳輸文件的方法,但測試發現了一個非常不容易發現的問題,這裡先說明一下。

錯誤的代碼如下:

  1 package com.TCP.java;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.FileNotFoundException;
  6 import java.io.FileOutputStream;
  7 import java.io.IOException;
  8 import java.io.InputStream;
  9 import java.io.OutputStream;
 10 import java.net.InetAddress;
 11 import java.net.ServerSocket;
 12 import java.net.Socket;
 13 
 14 import org.junit.Test;
 15 
 16 //從客戶端發送文件給服務端,服務端保存到本地。並返回“發送成功”給客戶端。並關閉相應的連接。
 17 public class TestTCP3 {
 18     //客戶端
 19     @Test
 20     public void client(){
 21         Socket socket = null;
 22         OutputStream os = null;
 23         FileInputStream fis = null;
 24         InputStream is = null;
 25         try {
 26             //創建一個Socket的對象
 27             socket = new Socket(InetAddress.getByName("192.168.1.101"),9090);
 28             //從本地獲取一個文件發送給服務端
 29             os = socket.getOutputStream();
 30             fis = new FileInputStream(new File("findLei.jpg"));
 31             byte[] b = new byte[1024];
 32             int length;
 33             while((length = fis.read(b)) != -1){
 34                 os.write(b,0,length);
 35             }
 36             socket.shutdownOutput();
 37             //接收來自服務端的信息
 38             is = socket.getInputStream();
 39             byte[] b1 = new byte[1024];
 40             int length1;
 41             while((length1 = is.read(b1)) != -1){
 42                 String str = new String(b1,0,length1);
 43                 System.out.println(str);
 44             }
 45         }catch (IOException e) {
 46             e.printStackTrace();
 47         }
 48         finally{
 49             //關閉相應的流和Socket對象
 50             if(is != null){
 51                 try {
 52                     is.close();
 53                 } catch (IOException e) {
 54                     e.printStackTrace();
 55                 }
 56             }
 57             if(fis != null){
 58                 try {
 59                     fis.close();
 60                 } catch (IOException e) {
 61                     e.printStackTrace();
 62                 }
 63             }
 64             if(os != null){
 65                 try {
 66                     os.close();
 67                 } catch (IOException e) {
 68                     e.printStackTrace();
 69                 }
 70             }
 71             if(socket != null){
 72                 try {
 73                     socket.close();
 74                 } catch (IOException e) {
 75                     e.printStackTrace();
 76                 }
 77             }
 78         }
 79     }
 80     
 81     //服務端
 82     @Test
 83     public void server(){
 84         ServerSocket ss = null;
 85         Socket s = null;
 86         InputStream is = null;
 87         FileOutputStream fos = null;
 88         OutputStream os = null;
 89         try {
 90             //創建一個ServerSocket的對象
 91             ss = new ServerSocket(9090);
 92             //調用accept()方法,返回一個Socket對象
 93             s = ss.accept();
 94             //將從客戶端發送的信息保存到本地
 95             is = s.getInputStream();
 96             fos = new FileOutputStream("D:/Test");
 97 //            Random random = new Random();
 98 //            fos = new FileOutputStream("D:/Test/" + String.valueOf(random.nextInt(90)) + ".jpg");
 99 //            fos = new FileOutputStream("find2.jpg");
100             byte[] b = new byte[1024];
101             int length;
102             while((length = is.read(b)) != -1){
103                 fos.write(b, 0, length);
104             }
105             //發送接收成功的消息
106             os = s.getOutputStream();
107             os.write("接收成功".getBytes());
108         } catch (FileNotFoundException e) {
109             e.printStackTrace();
110         } catch (IOException e) {
111             e.printStackTrace();
112         }
113         finally{
114             //關閉相應的流及ServerSocket,Socket對象
115             if(os != null){
116                 try {
117                     os.close();
118                 } catch (IOException e) {
119                     e.printStackTrace();
120                 }
121             }
122             if(fos != null){
123                 try {
124                     fos.close();
125                 } catch (IOException e) {
126                     e.printStackTrace();
127                 }
128             }
129             if(is != null){
130                 try {
131                     is.close();
132                 } catch (IOException e) {
133                     e.printStackTrace();
134                 }
135             }
136             if(s != null){
137                 try {
138                     s.close();
139                 } catch (IOException e) {
140                     e.printStackTrace();
141                 }
142             }
143             if(ss != null){
144                 try {
145                     ss.close();
146                 } catch (IOException e) {
147                     e.printStackTrace();
148                 }
149             }
150         }
151     }
152 }


有看出來問題麽,沒有,看著一點問題也沒有,但執行的時候就是報錯,而且報錯的位置著實很頭痛,在那附近找了很久也沒找到......

下麵是所報Error的信息

 1 java.net.SocketException: Software caused connection abort: socket write error
 2     at java.net.SocketOutputStream.socketWrite0(Native Method)
 3     at java.net.SocketOutputStream.socketWrite(Unknown Source)
 4     at java.net.SocketOutputStream.write(Unknown Source)
 5     at com.TCP.java.TestTCP3.client(TestTCP3.java:35)
 6     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 7     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 8     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 9     at java.lang.reflect.Method.invoke(Unknown Source)
10     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
11     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
12     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
13     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
14     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
15     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
16     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
17     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
18     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
19     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
20     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
21     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
22     at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
23     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
24     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
25     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
26     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
27     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
28     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)


指定的位置是35行寫入的問題,但是找了很久也沒找到原因,還要感謝我大姚哥幫我找到了這個問題

先說明一下這個Error的意思,大概就是Socket在寫入的時候出現故障了,調查這段代碼的過程就不一一詳述了,就說一下真正的原因在哪,真正的原因是server端需要寫入的文件夾目錄有問題,我寫的是fos = new FileOutputStream("D:/Test");這個路徑在直接寫入文件的時候有問題,這裡進行複製的時候需要指定其格式,及其命名,這個路徑明顯缺少這兩樣,而如果改成相對路徑就沒有那麼麻煩了,fos = new FileOutputStream("find2.jpg");這樣執行就成功了,但如果我們想將文件放在指定目錄下呢,可以用這種方式

Random random = new Random();

fos = new FileOutputStream("D:/Test/" + String.valueOf(random.nextInt(90)) + ".jpg")

這種方式可以自動添加一個隨機數,使其避免了重命名的風險,反正問題是已經解決了,成功代碼只需打開註釋即可

 

下麵說明一下此TCP傳輸需要進行的操作及實現的功能

1.選中server(服務端),用JUnit啟動。當傳輸文件時服務一定要先開啟啊,這是常識

2.選中client(客戶端),用JUnit啟動。其中這裡有兩個參數是需要手動改的,一個是IP,即你想要傳輸到的電腦(這臺電腦要啟動server)的IP;另一個就是埠號,這個是自己隨便命名的,像Tomcat一樣也需要一個埠號(Tomcat是8080)。

3.成功複製文件並列印友好回饋

 

*4.第二天在同一區域網上的兩台機器上測試,竟然不好使,尚未未找到原因,看到這篇博客的希望給點兒建議~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天抽空寫了一個wcf的創建和宿主程式的創建文章,下麵也有很多園友給了評論,在此謝謝大家給了我繼續記錄我的摸爬滾打之路信心……抱拳! 上次的文章《我的WCF摸爬滾打之路(1)》中寫到,在測試wcf例子的時候遇到很多稀奇古怪的異常,準備列個專題寫的。無奈學習不深,實在不敢潦草為之。今天就隨便說說吧!說 ...
  • 本文介紹壓縮庫SharpZipLib的使用,提供封裝類的源代碼,以及測試UI的源代碼。 ...
  • 轉至:http://www.cnblogs.com/fonour/p/ajaxFileUpload.html 0、下載 http://files.cnblogs.com/files/fonour/ajaxfileupload.js 1、引用ajaxfileupload.js 2、頁面添加類型為fil ...
  • 對於c++11來說移動語義是一個重要的概念,一直以來我對這個概念都似懂非懂。最近翻翻資料感覺突然開竅,因此記下。其實搞懂之後就會發現這個概念很簡單,並無什麼高深的地方。 先說說右值引用。右值一般指的是表示式中的臨時變數,在c++中臨時變數在表達式結束後就被銷毀了,之後程式就無法再引用這個變數了。但是 ...
  • 今天做了一下哲學家就餐問題。 附件 ...
  • 最近因為工作比較忙也沒有更新隨筆。昨天下班因為身體不舒服,代碼也沒有碼多少。說碼代碼也還算不上,畢竟是自己無聊寫點小腳本自娛自樂。 今天這篇主要的知識點是使用Python的BeautifulSoup進行多層的遍歷。 筆者閑來無事寫了個小爬蟲,主要是爬取京東商品分類以及對應的連接 如圖所示。只是一個簡 ...
  • 轉義字元 意義 ASCII碼值(十進位) \a 響鈴(BEL) 007 \b 退格(BS) ,將當前位置移到前一列 008 \f 換頁(FF),將當前位置移到下頁開頭 012 \n 換行(LF) ,將當前位置移到下一行開頭 010 \r 回車(CR) ,將當前位置移到本行開頭 013 \t 水平製表 ...
  • C數據類型 基本類型 數值類型 整型 短整型short 整型int 長整形long 浮點型 單精度型float 雙精度型double 字元類型char 構造類型 數組 結構體struct 共用體union 枚舉類型enum 指針類型 空類型void 符號屬性 長度屬性 基本型 位長(位元組) 取值範圍 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...