程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#實現使用Tcp/Ip下載文件的代碼

c#實現使用Tcp/Ip下載文件的代碼

編輯:C#入門知識

使用tcp/ip傳送文件。簡單設計思路是在服務器端啟動TcpListener監聽客戶端的Socket連接。
當Client發送連接請求,TcpListener捕獲當前請求的Socket,並獲取收到的數據(字符串,稱為命令)。
然後由命令處理程序分析字符串,如果字符串頭部包含GET_FILE則為下載文件請求。

例:如客戶機向服務器程序發送請求:"GET_FILE|D:PUBLISHTEST.DLL"。首先TcpListener捕獲
當前請求的Socket,收到字符串,如果是下載文件請求就通過socket.SendFile(file="D:PUBLISH
TEST.DLL")將文件傳送給當前Socket。在客戶端由NetworkStream.Read()方法接收來自服務器發送的文件。

同理,如果實現網上象棋對戰游戲,通過Socket.Send(命令)->分析->執行->移動棋子,不就實現了嗎?

Socket應用往往不止這些,學會Socket組件是網絡編程基礎。
 
服務器界面運行圖。
貼圖圖片

客戶機界面截圖:
貼圖圖片
輸入要下載的文件名及保存目錄。
 

思考:
1.如果提供一個下載文件清單,是不是可以批量下載文件?
2.如果服務器上的文件與本機的文件最後修改日期相比較,是不是可以改裝為版本升級程序?
3.如果客戶端向服務器上傳文件,是不是可以改裝成mini版的ftp程序?
4.如果收到的byte[]是某對象的序列化數據,而後將byte[]還原成對象,是不是實現tcp/ip傳送對象?
5.如果對象是一個電腦向另一個電腦傳送的某個命令,是不是可以實現網上對戰游戲?
6.你思想有多遠socket就能走多遠。
 

部分原代碼:
UpgraderClient.cs
 

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;

namespace VJSDN.Tech.TcpIpDownloader
{
   /// <summary>
   /// Tcp/ip下載器客戶端
   /// </summary>
   public class UpgraderClient
   {
      private OutputInvoke _writeOutput = null;
      
      public UpgraderClient(OutputInvoke writeOutput)
      {
         _writeOutput = writeOutput;
      }
      
      /// <summary>
      /// 下載文件
      /// </summary>
      public bool DownloadFile(string file, string savePath)
      {
         string hostIp = "8.8.8.2"; //主機ip
         int hostPort = 12346; //主機端口
         
         try
         {
            TcpClient client = new TcpClient();
            client.ReceiveTimeout = 1000 * 60;
            
            if (client == null || file.Trim() == "") return false;
            
            TryConnect(client, hostIp, hostPort); //連接服務器
            if (!client.Connected) return false;//連線線失敗,退出
            
            byte[] bs = Encoding.Unicode.GetBytes("GET_FILE|" + file);
            client.Client.Send(bs); //發送請求
            
            //開始接受數據....
            NetworkStream ns = client.GetStream();
            MemoryStream ms = new System.IO.MemoryStream();
            
            byte[] resBytes = new byte[256];
            int resSize;
            do
            {
               resSize = ns.Read(resBytes, 0, resBytes.Length);
               string msg = Byte2Str(resBytes);
               if (msg.Trim().ToUpper() == "FILE_NOT_FOUND")
               {
                  if (_writeOutput != null) _writeOutput("找不到文件:" + file);
     &n

  1. 上一頁:
  2. 下一頁: