日韩性视频-久久久蜜桃-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的网络文件服务的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 国产精品视频免费在线观看 | 天天综合网天天综合 | 成人免费观看视频大全 | 手机在线看黄色 | 美女又爽又黄免费 | 免费看国产曰批40分钟粉红裤头 | 亚洲成人欧美 | 手机在线免费视频 | 波多野结衣毛片 | 青青草原免费观看 | 日韩女同一区二区三区 | 一区在线观看视频 | 天天干 夜夜操 | 亚洲国产视频一区 | 综合xx网 | 亚洲国产欧美一区二区三区深喉 | 国产一级理论 | 国产成人免费av | 色91av | 丰满肥臀噗嗤啊x99av | 国产伦理一区二区三区 | 激情视频在线观看免费 | 久久二区三区 | 欧美日韩三 | 日本高清视频www夜色资源 | 自拍偷拍亚洲图片 | 亚洲乱亚洲乱妇 | 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | 欧美在线一级 | 先锋av资源 | 亚洲精品国产99 | 国产夫妻视频 | 日本a级片网站 | 国产免费一区二区三区 | 免费在线观看高清影视网站 | 日韩性xx| 欧美成网| 午夜久久久久久久久久影院 | 国产天天综合 | 最新黄网| 天天射寡妇 | 亚洲黄色在线网站 | 人妻丰满熟妇av无码区 | 日本欧美一级片 | 在线观看深夜视频 | 中文字幕一区二区三区门四区五区 | 一本久久精品一区二区 | 国产精品资源在线观看 | 欧美日韩国产一区二区在线观看 | 巨大乳の揉んで乳榨り奶水 | 99久久99| 中文字幕不卡在线 | 高清一区二区在线 | 日韩高清av在线 | 天天插视频 | 俄罗斯美女一级爱片 | 国产日韩欧美在线观看视频 | 日韩美一区二区三区 | 蜜桃精品久久久久久久免费影院 | 日韩欧美在线观看一区二区三区 | 亚洲视频在线观看免费 | 日韩免费福利 | 国产粉嫩在线 | 欧美理伦少妇2做爰 | 韩国三级hd中文字幕的背景音乐 | 欧美日韩三级视频 | av福利社| 中文字幕日本一区 | 色综合久久五月 | 久久成人高清 | 午夜视频| 日韩欧美国产一区二区三区 | 亚洲色成人www永久在线观看 | 欧美xxxxx少妇 | 欧美性插插 | 91精品国产高清一区二区三区蜜臀 | 人人干人人艹 | 亚洲综合精品 | 国产精品拍拍 | av激情在线 | 国产精品99久久久久 | 中文字幕精品在线视频 | 黄站在线观看 | 91精品国产91久久久久福利 | 天天爱夜夜爽 | 日韩欧美国产亚洲 | 好屌妞视频这里只有精品 | 国产资源一区 | 吸咬奶头狂揉60分钟视频 | 国产女主播福利 | 自拍视频在线播放 | 国产资源在线视频 | 99成人在线视频 | 亚洲精品一区二区三区新线路 | 国产大学生自拍视频 | 精品人妻一区二区三区日产乱码卜 | 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | 刘玥91精选国产在线观看 | 成年人网站在线免费观看 |