日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网络编程——实验一:基于TCPUDP的网络文件服务

發布時間:2023/12/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网络编程——实验一:基于TCPUDP的网络文件服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

前言:本篇文章不提供知識點教學,只提供一些常見問題的解決方法和實現實驗要求的學習路徑

1 java IO

2 java Socket

2.1 創建簡單的TCP連接

2.2 創建簡單的UDP連接

2.3 創建多線程服務器+多用戶連接服務器

3 文件傳輸

3.1 UDP文件傳輸

3.2 TCP文件傳輸

4 實現實驗要求

3.1 簡述實驗要求

3.2 創建TCP和UDP的服務器端

3.2 使用TCP傳輸用戶命令,使用UDP傳輸文件

3.3 文件目錄管理


?

前言:本篇文章不提供知識點教學,只提供一些常見問題的解決方法和實現實驗要求的學習路徑

?

1 java IO

?

2 java Socket

?

2.1 創建簡單的TCP連接

?

2.2 創建簡單的UDP連接

?

2.3 創建多線程服務器+多用戶連接服務器

?

3 文件傳輸

?

3.1 UDP文件傳輸

?

3.1.1 服務器端作為發送端,客戶端作為接收端

?

3.1.1.1 問題分解

  • 指定...

  • 關于服務器端如何獲取客戶端的host和port:

  • 已否決:通過客戶端連接

  • ?// connect():連接UDP客戶端和UDP服務器端dgSocket = new DatagramSocket(); // 隨機可用端口,又稱匿名端口dgSocket.connect(new InetSocketAddress(HOST, UDP_PORT));
  • 嘗試:UDP客戶端發送一份數據給UDP服務器端,通過dp.getAddress()和dp.getPort()獲取UDP客戶端的端口號

  • ?

    3.1.1.2 關鍵問題

  • 問題1:指定文件的大小(其實沒必要,不用指定文件大小,每次按固定的大小循環傳輸直到傳完所有的數據即可)

  • 問題如下圖所示:

  • 服務器端代碼:

    ?pw.println("文件大小:" + is.available() + " bytes"); // 告訴客戶端要接收的文件的大小(單位:byte)
  • 客戶端代碼:

    ?int length = Integer.parseInt(br.readLine()); // 獲取服務器端傳來的文件的大小(單位:byte)
  • 由于輸入不是純數字,因此String不能順利轉換為int

  • 解決方案:

    ? // 預定義bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));// 服務器端is = new FileInputStream(new File(BASE_PATH + fileName));byte[] b = new byte[is.available()];System.out.println(is.available());pw.println(is.available()); // 告訴客戶端要接收的文件的大小(單位:byte) ? // 預定義br = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 客戶端int length = Integer.parseInt(br.readLine()); // 獲取服務器端傳來的文件的大小(單位:byte)System.out.println("文件大小為:" + length + " bytes");byte[] b = new byte[length];
  • 問題2:文件過大,不能一次傳輸完

  • 問題描述:

  • 解決方案:分段傳輸

  • 代碼如下:

    ? // 服務器端is = new FileInputStream(new File(BASE_PATH + fileName));pw.println(is.available()); // 告訴客戶端要接收的文件的大小(單位:byte)byte[] b = new byte[BYTE_LEN];// 創建UDP數據報while (is.read(b) != -1) {DatagramPacket dp = new DatagramPacket(b, b.length, socketAddress);dgSocket.send(dp);System.out.println("傳輸文件中...");TimeUnit.MICROSECONDS.sleep(100); // 限制傳輸速度}System.out.println("文件發送成功"); ? // 客戶端os = new FileOutputStream(new File(BASE_PATH + fileName));byte[] b = new byte[BYTE_LEN];DatagramPacket dp = new DatagramPacket(b, b.length);int length = Integer.parseInt(br.readLine()); // 獲取服務器端傳來的文件的大小(單位:byte)while (length > 0) {// 接收數據dgSocket.receive(dp);os.write(b, 0, b.length);os.flush();System.out.println("接收文件中...");length -= BYTE_LEN;}

    ?

  • 問題3:文件名輸入錯誤(系統在該目錄下找不到該文件),未使用try catch語句捕捉錯誤

  • 問題描述:

  • 解決方案:

    ? // 服務器端try {is = new FileInputStream(new File(BASE_PATH + fileName));} catch(FileNotFoundException e) {System.out.println("不存在該文件,取消文件傳輸");pw.println("不存在該文件,取消文件傳輸");e.printStackTrace();return;} ? if( br.readLine().equals("不存在該文件,取消文件傳輸") ) {System.out.println("取消文件傳輸,結束本次通信");return;} else {System.out.println("文件已驗證存在");}
  • 衍生問題:由于已經調用過一次br.readLine(),后面又通過br.readLine()獲取文件長度。而readLine()會移動讀取指針,且服務器端只傳了一次length(通過pw.println(is.available());),因此在第二次調用br.readLine()的時候,客戶端獲取的內容為空,導致線程阻塞,文件傳輸不能正常進行。

  • 解決方案:

    ? // 預定義PrintWriter pw = new PrintWriter(bw, true);// 服務器端// 傳兩次,因為客戶端br.readLine()使用了兩次【readLine()函數使用一次會移動讀取指針】pw.println(is.available()); // 告訴客戶端要接收的文件的大小(單位:byte)pw.println(is.available()); // 告訴客戶端要接收的文件的大小(單位:byte) ? // 預定義BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 客戶端if( br.readLine().equals("不存在該文件,取消文件傳輸") ) {System.out.println("取消文件傳輸,結束本次通信");return;} else {System.out.println("文件已驗證存在");}int length = Integer.parseInt(br.readLine()); // 獲取服務器端傳來的文件的大小(單位:byte)
  • 問題4:

  • ?

    3.1.2 客戶端作為發送端,服務器端作為接收端

    ?

    3.2 TCP文件傳輸

    ?

    4 實現實驗要求

    ?

    3.1 簡述實驗要求

    1) 復習Java I/O和Socket編程相關概念和方法;

    2) 基于Java Socket TCP和UDP實現一個簡易的網絡文件服務程序,包含服務器端FileServer和客戶端FileClient;

    3) 服務器端啟動時需傳遞root目錄參數,并校驗該目錄是否有效;

    4) 服務器啟動后,開啟TCP:2021端口,UDP:2020端口,其中,TCP連接負責與用戶交互,UDP負責傳送文件;

    5) 客戶端啟動后,連接指定服務器的TCP 2021端口,成功后,服務器端回復信息:“客戶端IP地址:客戶端端口號>連接成功”;

    6) 連接成功后,用戶可通過客戶端命令行執行以下命令:

    *[1] ls* 服務器返回當前目錄文件列表(<file/dir> name size)

    *[2] cd * 進入指定目錄(需判斷目錄是否存在,并給出提示)

    *[3] get * 通過UDP下載指定文件,保存到客戶端當前目錄下

    *[4] bye* 斷開連接,客戶端運行完畢

    7) 服務器端支持多用戶并發訪問,不用考慮文件過大或UDP傳輸不可靠的問題。

    ?

    3.2 創建TCP和UDP的服務器端

    ?

    3.2 使用TCP傳輸用戶命令,使用UDP傳輸文件

    ?

    3.3 文件目錄管理

    總結

    以上是生活随笔為你收集整理的网络编程——实验一:基于TCPUDP的网络文件服务的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 91精品国产91久久久久久吃药 | 国产99久久 | 欧美视频观看 | 亚洲欧美日韩在线不卡 | 免费无遮挡无码永久视频 | 大伊人网 | 99久久国产免费 | 91视频.com| 国产精品99久久久久久宅男 | 日本午夜三级 | 国产精品久久久久免费 | 久久久久99精品成人片 | 日本a免费| 麻豆传媒一区二区 | 樱桃av | 亚洲乱码在线 | 大乳丰满人妻中文字幕日本 | 少女视频的播放方法 | 国产综合福利 | 免费爱爱视频网站 | 国产精品视频一区二区三区不卡 | 麻豆md0034在线观看 | 欧美少妇网 | 亚洲成人午夜在线 | www网站在线观看 | 国产夫妻性生活视频 | 久久91精品 | 在线观看日韩av电影 | av剧情在线| 久热免费| 91免费版黄 | 成人免费观看网址 | 国产精品五区 | 爱爱一区二区三区 | 国产精品久久久久9999爆乳 | 白白色视频在线 | 欧美乱视频 | 欧美日韩中文国产一区发布 | 天天插天天狠 | 美日韩中文字幕 | 亚洲精品色午夜无码专区日韩 | 国产成人精品无码播放 | 91超碰在线观看 | 女女同性女同一区二区三区九色 | 91叼嘿视频| аⅴ天堂中文在线网 | 欧美视频免费看 | 免费高清欧美大片在线观看 | 国产成人无码精品久久二区三 | 国产丝袜久久 | 五月婷婷久久综合 | 欧美v在线 | 在线激情网站 | 我和公激情中文字幕 | 动漫美女被到爽流 | 日韩国产精品一区二区 | av国语| 国产精品操 | 九九热视频在线观看 | 日本一区二区视频免费 | 国产精品一区二区三区在线播放 | 欧美另类videosbestsex日本 | 午夜精品久久久久久久91蜜桃 | av手机免费观看 | 国产一区二区三区亚洲 | 少妇无内裤下蹲露大唇视频 | 人善交videos欧美3d动漫 | 国产女人与zoxxxx另类 | 黄色三级视频 | 丰满人妻一区二区三区免费视频棣 | 日韩精品在线免费 | 国产一区免费观看 | 一个色的综合 | 妓院一钑片免看黄大片 | 久久国产视频网 | 久久精品久久久 | av中文字幕观看 | 四虎tv| 一级免费视频 | 亚洲乱码国产一区三区 | 懂色av一区二区三区 | 黄页在线观看 | av毛片网站 | 粉嫩小箩莉奶水四溅在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 国产福利二区 | 日本体内she精高潮 男女视频在线免费观看 | 动漫av一区 | 97在线观看免费视频 | 国产精品福利电影 | 高清亚洲 | 中国国产bdsm紧缚捆绑 | 国模丫头1000人体 | 在线播放成人av | 成人听书哪个软件好 | 二区欧美 | 亚洲a网站 | 久久成人国产 | 国产av 一区二区三区 |