我现在有个需求,其实很简单,就是把客户端的10M文件传到服务端,我看了下网上的列子都是发送字符串,不知道文件这样分批怎么上传,望给点代码。如果能给个进度条就万分感谢。
我用webservice做,老是超时,麻烦帮个忙,给点代码,感谢。

解决方案 »

  1.   

    long count = 0;
    long mlength = 0;
    long bytelength = 0;FileStream fs = new FileStream(@"C:\demo.jpg", FileMode.Open, FileAccess.Read, FileShare.Read); 

    byte[] buffers = Encoding.Default.GetBytes("File-Length:" + fs.Length.ToString());  
    m_socket.Send(buffers);
    Thread.Sleep(1000);
     
    while(fs.Position < fs.Length)
    {
    if(fs.Length - mlength >= 1024)
    {
    bytelength = 1024;
      }
    else
    {
    bytelength = fs.Length - mlength;
    }
    byte[] buffer = new byte[bytelength];
    fs.Read(buffer, 0, buffer.Length);
    m_socket.Send(buffer);
    m_socket.Send(buffer, 0, buffer.Length, SocketFlags.None);
      Thread.Sleep(1000); 
      count++;
      mlength += buffer.Length;
      if(fs.Position == fs.Length)
      {
      break;
      }
    }
    fs.Close();
      

  2.   

    进度条的最大值就是文件的长度,每次发送完一个包,进度条就增加buffer.Length
      

  3.   

    stonegoldaustin(特醇中南海) 非常感谢,能贴个接受方的代码吗?后台怎么把两个byte合并啊?
      

  4.   

    后台合并byte[]
    byte[][] s = new byte[3][];
    s[0] = new byte[1024];
    s[1] = new byte[2048];
    s[2] = new byte[4096];
    ...
    byte[] u = unite(s);public byte[] unite(byte[][] source )
    {
      int rank = source.GetLength(0);
      int sumlen=0;
      for(int i=0;i<rank;i++)
      {
        sumlen+=s[i].length;
      }
      byte[] sum= new byte[sumlen];
      int place = 0;
      for(int i=0;i<rank;i++)
      {
        s[i].CopyTo(sum,place);
        place+=s[i].length;
      }
      return sum;
    }
    ================================================================
    此帖通过csdn小助手回复。
        CSDN小助手是使用vb.net编写的CSDN论坛脱机“外挂”,她能够在
    脱离IE的情况下使用Csdn论坛。程序只加载最核心的数据,所以显示更
    快,产生的流量更小。    下载地址:http://qqwwee.com/csdn.rar
    ================================================================
      

  5.   

    FileStream recfs = new FileStream(clientList,FileMode.OpenOrCreate,FileAccess.Write);
    BinaryWriter newfilestr = new BinaryWriter(recfs);
    byte[] tmpbyte1 = new byte[1028];
    while(true)
    {
    hostsocket.Receive(tmpbyte1);
    try
    {
    byte[] sub = new byte[4];
    sub[0] = tmpbyte1[1024];
    sub[1] = tmpbyte1[1025];
    sub[2] = tmpbyte1[1026];
    sub[3] = tmpbyte1[1027];
    int sub1 = sub[0]*1000+sub[1]*100+sub[2]*10+sub[3];
    if(sub1 == 1024)
    {
    newfilestr.Write(tmpbyte1,0,1024);
    tmpbyte1 = new byte[1028];
    }
    else
    {
    newfilestr.Write(tmpbyte1,0,sub1);
    tmpbyte1 = new byte[1028];
    newfilestr.Flush();
    newfilestr.Close();
    recfs.Close();
    break;
    }
    }
      

  6.   

    public delegate void SocketAccepted(Socket socket);
    public delegate void SocketInfoArrival(Socket socket, string infomation);
    public class cls_SocketServer
    {
    public Socket sktMain; //主套接字
    public Socket u_socket; private Thread trdMain; //主线程
    private ManualResetEvent allDone = new ManualResetEvent(false);
    private const int bufSize = 1024; //缓冲大小
    private byte[] received = new byte[bufSize]; //Byte缓冲 public event SocketAccepted socketaccepted; //接受连接事件
    public event SocketInfoArrival socketinfoarrival; //文本数据到达事件
    public cls_SocketServer(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
    {
    sktMain = new Socket(addressFamily, socketType, protocolType);
    } public void socketListen(int port)
    {
    //套接字进行监听
    //参数表:port:进行监听的端口号
    try
    {
    IPHostEntry m_local = Dns.Resolve(Dns.GetHostName());
    IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse(m_local.AddressList[0].ToString()), port);
    sktMain.Bind(ipendPoint);
    sktMain.Listen(20);
    trdMain = new Thread(new ThreadStart(MainThread));
    trdMain.Start();
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.ToString()); 
    }
    } private void AsyncAccept(IAsyncResult ar)
    {
    //异步回调接受连接请求
    try
    {
    allDone.Set();
    Socket a_socket = (Socket)ar.AsyncState;
    Socket handle = a_socket.EndAccept(ar);
    u_socket = handle;
    Console.WriteLine(u_socket.Handle.ToString());  
    socketaccepted(handle);
    //进行异步接收数据
    handle.BeginReceive(received, 0, bufSize, SocketFlags.None, new AsyncCallback(AsyncReceive), handle); 
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.ToString());
    }
    } private void AsyncReceive(IAsyncResult ar)
    {
    //异步回调接收数据
    try
    {
    Socket r_socket = (Socket) ar.AsyncState;
    int read = r_socket.EndReceive(ar);
    if(read > 0)
    { string result = Encoding.Default.GetString(received);
    socketinfoarrival(r_socket, result);
    r_socket.BeginReceive(received, 0, received.Length, SocketFlags.None, new AsyncCallback(AsyncReceive), r_socket); 
    }
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.ToString());
    }
    } private void MainThread()
    {
    try
    {
    while(true)
    {
    allDone.Reset();
    Console.WriteLine("Waiting For Connection. . .");
    sktMain.BeginAccept(new AsyncCallback(AsyncAccept), sktMain); //进入监听状态
    allDone.WaitOne(3000, true);   
    }
    }
    catch(Exception ex)
    {
    Console.WriteLine(ex.ToString());
    }
    } public void CloseSocket()
    {
    trdMain.Abort();
    if(sktMain != null)
    {
    sktMain.Close();
    }
    }
    }
      

  7.   

    如果发送的是文本的话,直接用AsyncReceive就可以了如果发送的二进制数据,改一下AsyncReceive,不用转string了,直接用byte数组存文件