当前位置:编程学习 > C#/ASP.NET >>

c#实现使用Tcp/Ip下载文件的代码

使用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
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,