现在作一个用tcp/ip协议来传文件!! 有个问题 每一次传送的时候 有两个文件
 1 视频文件或图片文件   
 2 这些文件相关信息
 
{[2][序列][文件类型][文件][3]} 想以这种格式传送
因为文件太大  要分包传送,想用[2] 数组代表开始  [3]代表这个包发送结束  整个文件发送完成 向client发送一个信息
实在想不出要怎么弄了 !! 请各位大虾帮一下吧!! 在线等结果312170703
 

解决方案 »

  1.   

    简单C# Tcp文件传输# using System;  
    # using System.Net;  
    # using System.Net.Sockets;  
    # using System.IO;  
    #   
    # namespace Win  
    # {  
    #     /// <summary>  
    #     /// Net : 提供静态方法,对常用的网络操作进行封装  
    #     /// </summary>  
    #     public sealed class Net  
    #     {  
    #         private Net()  
    #         {  
    #         }  
    #   
    #         /// <summary>  
    #         /// 连接使用 tcp 协议的服务端  
    #         /// </summary>  
    #         /// <param name="ip">服务端的ip地址</param>  
    #         /// <param name="port">服务端的端口号</param>  
    #         /// <returns></returns>  
    #         public static Socket ConnectServer(string ip, int port)  
    #         {  
    #             Socket s = null;  
    #   
    #             try  
    #             {  
    #                 IPAddress ipAddress = IPAddress.Parse(ip);  
    #                 IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);  
    #                 s = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);  
    #                 s.Connect(ipEndPoint);  
    #                 if (s.Connected == false)  
    #                 {  
    #                     s = null;  
    #                 }  
    #             }  
    #             catch (Exception e)  
    #             {  
    #                 Log.WriteLog(e);  
    #             }  
    #             return s;  
    #         }  
    #         /// <summary>  
    #         /// 用主机名称连接使用Tcp协议的服务端  
    #         /// </summary>  
    #         /// <param name="hostName">在hosts 文件中存在的主机名称< /param>  
    #         /// <param name="port">服务端的端口号</param>  
    #         /// <returns></returns>  
    #         public static Socket ConnectServByHostName(string hostName, int port)  
    #         {  
    #             Socket s = null;  
    #             IPHostEntry iphe = null;  
    #   
    #             try  
    #             {  
    #                 iphe = Dns.Resolve(hostName);  
    #                 foreach (IPAddress ipad in iphe.AddressList)  
    #                 {  
    #                     IPEndPoint ipe = new IPEndPoint(ipad, port);  
    #                     Socket tmps = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);  
    #                     tmps.Connect(ipe);  
    #   
    #                     if (tmps.Connected)  
    #                     {  
    #                         s = tmps;  
    #                         break;  
    #                     }  
    #                     else  
    #                         continue;  
    #                 }  
    #             }  
    #             catch (Exception e)  
    #             {  
    #                 Log.WriteLog(e);  
    #             }  
    #             return s;  
    #         }  
    #         /// <summary>  
    #         /// 向远程主机发送数据  
    #         /// </summary>  
    #         /// <param name="socket">要发送数据且已经连接到远程主机的 Socket& lt;/param>  
    #         /// <param name="buffer">待发送的数据</param>  
    #         /// <param name="outTime">发送数据的超时时间,以秒为单位,可以精确到微秒</param>  
    #         /// <returns>0:发送数据成功;-1:超时;-2:发送数据出现错误;-3:发送数据时出现异常</returns>  
    #         /// <res >  
    #         /// 当 outTime 指定为-1时,将一直等待直到有数据需要发送  
    #         /// </res>  
    #         public static int SendData(Socket socket, byte[] buffer, int outTime)  
    #         {  
    #             if (socket == null || socket.Connected == false)  
    #             {  
    #                 throw new ArgumentException("参数socket 为null,或者未连接到远程计算机");  
    #             }  
    #             if (buffer == null || buffer.Length == 0)  
    #             {  
    #                 throw new ArgumentException("参数buffer 为null ,或者长度为 0");  
    #             }  
    #   
    #             int flag = 0;  
    #             try  
    #             {  
    #                 int left = buffer.Length;  
    #                 int sndLen = 0;  
    #   
    #                 while (true)  
    #                 {  
    #                     if ((socket.Poll(outTime * 1000000, SelectMode.SelectWrite) == true))  
    #                     {        // 收集了足够多的传出数据后开始发送  
    #                         sndLen = socket.Send(buffer, sndLen, left, SocketFlags.None);  
    #                         left -= sndLen;  
    #                         if (left == 0)  
    #                         {                                        // 数据已经全部发送  
    #                             flag = 0;  
    #                             break;  
    #                         }  
    #                         else  
    #                         {  
    #                             if (sndLen > 0)  
    #                             {                                    // 数据部分已经被发送  
    #                                 continue;  
    #                             }  
    #                             else  
    #                             {                                                // 发送数据发生错误  
    #                                 flag = -2;  
    #                                 break;  
    #                             }  
    #                         }  
    #                     }  
    #                     else  
    #                     {                                                        // 超时退出  
    #                         flag = -1;  
    #                         break;  
    #                     }  
    #                 }  
    #             }  
    #             catch (SocketException e)  
    #             {  
    #                 Log.WriteLog(e);  
    #                 flag = -3;  
    #             }  
    #             return flag;  
    #         }  
    #         /// <summary>  
    #         /// 向远程主机发送数据  
    #         /// </summary>  
    #         /// <param name="socket">要发送数据且已经连接到远程主机的 Socket& lt;/param>  
    #         /// <param name="buffer">待发送的字符串</param>  
    #         /// <param name="outTime">发送数据的超时时间,以秒为单位,可以精确到微秒</param>  
    #         /// <returns>0:发送数据成功;-1:超时;-2:发送数据出现错误;-3:发送数据时出现异常</returns>  
    #         /// <res >  
    #         /// 当 outTime 指定为-1时,将一直等待直到有数据需要发送  
    #         /// </res>  
    #         public static int SendData(Socket socket, string buffer, int outTime)  
    #         {  
    #             if (buffer == null || buffer.Length == 0)  
    #             {  
    #                 throw new ArgumentException("待发送的字符串长度不能为零.");  
    #             }  
    #             return (SendData(socket, System.Text.Encoding.Default.GetBytes(buffer), outTime));  
    #         }  
    #         /// <summary>  
    #         /// 接收远程主机发送的数据  
    #         /// </summary>  
    #         /// <param name="socket">要接收数据且已经连接到远程主机的 socket& lt;/param>  
    #         /// <param name="buffer">接收数据的缓冲区</param>  
    #         /// <param name="outTime">接收数据的超时时间,以秒为单位,可以精确到微秒</param>  
    #         /// <returns>0:接收数据成功;-1:超时;-2:接收数据出现错误;-3:接收数据时出现异常</returns>  
    #         /// <res >  
    #         /// 1、当 outTime 指定为-1时,将一直等待直到有数据需要接收;  
    #         /// 2、需要接收的数据的长度,由 buffer 的长度决定。  
    #         /// </res>  
    #         public static int RecvData(Socket socket, byte[] buffer, int outTime)  
    #         {  
    #             if (socket == null || socket.Connected == false)  
    #             {  
    #                 throw new ArgumentException("参数socket 为null,或者未连接到远程计算机");  
    #             }  
    #             if (buffer == null || buffer.Length == 0)  
    #             {  
    #                 throw new ArgumentException("参数buffer 为null ,或者长度为 0");  
    #             }  
    #             buffer.Initialize();  
    #             int left = buffer.Length;  
    #             int curRcv = 0;  
    #             int flag = 0;  
    #   
    #             try  
    #             {  
    #                 while (true)  
    #                 {  
    #                     if (socket.Poll(outTime * 1000000, SelectMode.SelectRead))  
    #                     {        // 已经有数据等待接收  
    #                         curRcv = socket.Receive(buffer, curRcv, left, SocketFlags.None);  
    #                         left -= curRcv;  
    #                         if (left == 0)  
    #                         {                                    // 数据已经全部接收   
    #                             flag = 0;  
    #                             break;  
    #                         }  
    #                         else  
    #                         {  
    #                             if (curRcv > 0)  
    #                             {                                // 数据已经部分接收  
    #                                 continue;  
    #                             }  
    #                             else  
    #                             {                                            // 出现错误  
    #                                 flag = -2;  
    #                                 break;  
    #                             }  
    #                         }  
    #                     }  
    #                     else  
    #                     {                                                    // 超时退出  
    #                         flag = -1;  
    #                         break;  
    #                     }  
    #                 }  
    #             }  
    #             catch (SocketException e)  
    #             {  
    #                 Log.WriteLog(e);  
    #                 flag = -3;  
    #             }  
    #             return flag;  
    #         }  
      

  2.   


    #  /// <summary>  
    #         /// 接收远程主机发送的数据  
    #         /// </summary>  
    #         /// <param name="socket">要接收数据且已经连接到远程主机的 socket& lt;/param>  
    #         /// <param name="buffer">存储接收到的数据的字符串</param& gt;  
    #         /// <param name="bufferLen">待接收的数据的长度</param& gt;  
    #         /// <param name="outTime">接收数据的超时时间,以秒为单位,可以精确到微秒& lt;/param>  
    #         /// <returns>0:接收数据成功;-1:超时;-2:接收数据出现错误;-3:接收数据时出现异常</returns>  
    #         /// <res >  
    #         /// 当 outTime 指定为-1时,将一直等待直到有数据需要接收;  
    #         /// </res>  
    #         public static int RecvData(Socket socket, string buffer, int bufferLen, int outTime)  
    #         {  
    #             if (bufferLen <= 0)  
    #             {  
    #                 throw new ArgumentException("存储待接收数据的缓冲区长度必须大于0");  
    #             }  
    #             byte[] tmp = new byte[bufferLen];  
    #             int flag = 0;  
    #             if ((flag = RecvData(socket, tmp, outTime)) == 0)  
    #             {  
    #                 buffer = System.Text.Encoding.Default.GetString(tmp);  
    #             }  
    #             return flag;  
    #         }  
    #         /// <summary>  
    #         /// 向远程主机发送文件  
    #         /// </summary>  
    #         /// <param name="socket" >要发送数据且已经连接到远程主机的 socket</param>  
    #         /// <param name="fileName">待发送的文件名称</param>  
    #         /// <param name="maxBufferLength">文件发送时的缓冲区大小< /param>  
    #         /// <param name="outTime">发送缓冲区中的数据的超时时间< /param>  
    #         /// <returns>0:发送文件成功;-1:超时;-2:发送文件出现错误;-3:发送文件出现异常;-4:读取待发送文件发生错误</returns>  
    #         /// <res >  
    #         /// 当 outTime 指定为-1时,将一直等待直到有数据需要发送  
    #         /// </res>  
    #         public static int SendFile(Socket socket, string fileName, int maxBufferLength, int outTime)  
    #         {  
    #             if (fileName == null || maxBufferLength <= 0)  
    #             {  
    #                 throw new ArgumentException("待发送的文件名称为空或发送缓冲区的大小设置不正确.");  
    #             }  
    #             int flag = 0;  
    #             try  
    #             {  
    #                 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);  
    #                 long fileLen = fs.Length;                        // 文件长度  
    #                 long leftLen = fileLen;                            // 未读取部分  
    #                 int readLen = 0;                                // 已读取部分  
    #                 byte[] buffer = null;  
    #   
    #                 if (fileLen <= maxBufferLength)  
    #                 {            /* 文件可以一次读取*/  
    #                     buffer = new byte[fileLen];  
    #                     readLen = fs.Read(buffer, 0, (int)fileLen);  
    #                     flag = SendData(socket, buffer, outTime);  
    #                 }  
    #                 else  
    #                 {                                    /* 循环读取文件,并发送 */  
    #                     buffer = new byte[maxBufferLength];  
    #                     while (leftLen != 0)  
    #                     {  
    #                         readLen = fs.Read(buffer, 0, maxBufferLength);  
    #                         if ((flag = SendData(socket, buffer, outTime)) < 0)  
    #                         {  
    #                             break;  
    #                         }  
    #                         leftLen -= readLen;  
    #                     }  
    #                 }  
    #                 fs.Close();  
    #             }  
    #             catch (IOException e)  
    #             {  
    #                 Log.WriteLog(e);  
    #                 flag = -4;  
    #             }  
    #             return flag;  
    #         }  
    #         /// <summary>  
    #         /// 向远程主机发送文件  
    #         /// </summary>  
    #         /// <param name="socket" >要发送数据且已经连接到远程主机的 socket</param>  
    #         /// <param name="fileName">待发送的文件名称</param>  
    #         /// <returns>0:发送文件成功;-1:超时;-2:发送文件出现错误;-3:发送文件出现异常;-4:读取待发送文件发生错误</returns>  
    #         public static int SendFile(Socket socket, string fileName)  
    #         {  
    #             return SendFile(socket, fileName, 2048, 1);  
    #         }  
    #         /// <summary>  
    #         /// 接收远程主机发送的文件  
    #         /// </summary>  
    #         /// <param name="socket">待接收数据且已经连接到远程主机的 socket& lt;/param>  
    #         /// <param name="fileName">保存接收到的数据的文件名</param& gt;  
    #         /// <param name="fileLength" >待接收的文件的长度</param& gt;  
    #         /// <param name="maxBufferLength">接收文件时最大的缓冲区大小& lt;/param>  
    #         /// <param name="outTime">接受缓冲区数据的超时时间</param& gt;  
    #         /// <returns>0:接收文件成功;-1:超时;-2:接收文件出现错误;-3:接收文件出现异常;-4:写入接收文件发生错误</returns>  
    #         /// <res >  
    #         /// 当 outTime 指定为-1时,将一直等待直到有数据需要接收  
    #         /// </res>  
    #         public static int RecvFile(Socket socket, string fileName, long fileLength, int maxBufferLength, int outTime)  
    #         {  
    #             if (fileName == null || maxBufferLength <= 0)  
    #             {  
    #                 throw new ArgumentException("保存接收数据的文件名称为空或发送缓冲区的大小设置不正确.");  
    #             }  
    #   
    #             int flag = 0;  
    #             try  
    #             {  
    #                 FileStream fs = new FileStream(fileName, FileMode.Create);  
    #                 byte[] buffer = null;  
    #   
    #                 if (fileLength <= maxBufferLength)  
    #                 {                /* 一次读取所传送的文件 */  
    #                     buffer = new byte[fileLength];  
    #                     if ((flag = RecvData(socket, buffer, outTime)) == 0)  
    #                     {  
    #                         fs.Write(buffer, 0, (int)fileLength);  
    #                     }  
    #                 }  
    #                 else  
    #                 {                                        /* 循环读取网络数据,并写入文件 */  
    #                     int rcvLen = maxBufferLength;  
    #                     long leftLen = fileLength;                        //剩下未写入的数据  
    #                     buffer = new byte[rcvLen];  
    #   
    #                     while (leftLen != 0)  
    #                     {  
    #                         if ((flag = RecvData(socket, buffer, outTime)) < 0)  
    #                         {  
    #                             break;  
    #                         }  
    #                         fs.Write(buffer, 0, rcvLen);  
    #                         leftLen -= rcvLen;  
    #                         rcvLen = (maxBufferLength < leftLen) ? maxBufferLength : ((int)leftLen);  
    #                     }  
    #                 }  
    #                 fs.Close();  
    #             }  
    #             catch (IOException e)  
    #             {  
    #                 Log.WriteLog(e);  
    #                 flag = -4;  
    #             }  
    #             return flag;  
    #         }  
    #         /// <summary>  
    #         /// 接收远程主机发送的文件  
    #         /// </summary>  
    #         /// <param name="socket">待接收数据且已经连接到远程主机的 socket& lt;/param>  
    #         /// <param name="fileName">保存接收到的数据的文件名</param& gt;  
    #         /// <param name="fileLength" >待接收的文件的长度</param& gt;  
    #         /// <returns>0:接收文件成功;-1:超时;-2:接收文件出现错误;-3:接收文件出现异常;-4:写入接收文件发生错误</returns>  
    #         public static int RecvFile(Socket socket, string fileName, long fileLength)  
    #         {  
    #             return RecvFile(socket, fileName, fileLength, 2048, 1);  
    #         }  
    #     }  
    # }  
      

  3.   

    {[2][序列][文件类型][文件][3]} 想以这种格式传送
    因为文件太大 要分包传送,想用[2] 数组代表开始 [3]代表这个包发送结束 整个文件发送完成 向client发送一个信息
    在服务器那边怎么来区分发的是什么文件啊!  还要同时发送两个文件  第一个文件 有可能是Avi 也有可能是bmp     第二个文件就是一个txt文本文件
      

  4.   

    用C#实现HTTP协议下的多线程文件传输http://tech.163.com/06/0706/10/2LBFVLFM0009159R.html
      

  5.   

    这个是TCP的文件传输,你可以自己借鉴改一下
    http://download.csdn.net/detail/ijihkhjhg/4768109