class ClientState 
    {
        public byte[] state = new byte[1024];
        public Socket sk;
    }
    class FileState
    {
      public  FileStream fs;
       public string filename;
       public const int length = 1024;
       public byte[] state = new byte[length];
      public Socket sk;
    }
 private void AsyCallback(IAsyncResult ar)
        {
            //获取侦听器
            TcpListener tl = ar.AsyncState as TcpListener;
            //获取客户端的Socket
            sk = tl.EndAcceptSocket(ar);
           
            ClientState cs = new ClientState();
            cs.sk = sk;
            
            sk.BeginReceive(cs.state, 0, cs.state.Length, SocketFlags.None, new AsyncCallback(Read_Callback), cs);
            //异步接受数据
            tl.BeginAcceptSocket(new AsyncCallback(AsyCallback), tl);        }    public  void Read_Callback(IAsyncResult ar)
        {
                ClientState cs = (ClientState)ar.AsyncState;
                Socket s = cs.sk;                int read = s.EndReceive(ar);
                byte[] fnl = cs.state;
                MemoryStream ms = new MemoryStream();
                BinaryFormatter bf = new BinaryFormatter();
                ms.Write(fnl, 0, fnl.Length);
                ms.Position = 0;
                ArrayList aal = (ArrayList)bf.Deserialize(ms);
                FileState fstate = new FileState();
                fstate.filename = aal[1] as string;
                fstate.sk = s;
                fstate.fs = new FileStream(@"C:\Users\Administrator\" + fstate.filename, FileMode.OpenOrCreate, FileAccess.Write);
                s.BeginReceive(fstate.state, 0, FileState.length, 0, new AsyncCallback(ReceMsgCallBack), fstate);
            
        } public void ReceMsgCallBack(IAsyncResult ar)
        {
            FileState cs = ar.AsyncState as FileState;
            Socket thisSk = cs.sk;
            int read = thisSk.EndReceive(ar);
            if (read>0)
            {
             
                cs.fs.Write(cs.state, 0, read);
                thisSk.BeginReceive(cs.state, 0, FileState.length, 0, new AsyncCallback(ReceMsgCallBack), cs);
               
            }
            else 
            {
              
                cs.fs.Write(cs.state, 0, read);
                ClientState tcs = new ClientState();
                tcs.sk = thisSk;
                cs.fs.Close();
                sk.BeginReceive(tcs.state, 0, tcs.state.Length, SocketFlags.None, new AsyncCallback(Read_Callback), tcs);
            }
          
           
        }
经过修改该这是接受的代码  首先客户端先发送序列化的文件名过来 然后再发送文件过来 但我读取的时候 第一次接受个图片还可以 但第二次就不行了 不知道怎么回事 求大神求解

解决方案 »

  1.   

    一般判断Socked对象的Available属性,结合循环不是太准确
    自己定义数据帧,自己组织数据包进行传递
    一个包长度|总包数|第几包|值|检验
      

  2.   

    SOKECT不是有  Revalce 吗,返回 0 就是失败了 
      

  3.   

    在rfc2183中定义了一种在http中post内容(包括上传文件)的协议,很简单,例如:
    --------------- akldf kakfaskdfasda
    Content-Disposition: form-data; name="小电影"; filename="mao1234.mp4"xxxxxxxxxxxxxxxxxxxxxxxxxxx.....一堆二进制代码
    --------------- akldf kakfaskdfasda
    Content-Disposition: form-data; name="参数1"3.1415926--------------- akldf kakfaskdfasda-- 也就是说,数据和数据之间是有分割字符串来区分其开始结束的。这样在你收到数据时,需要将数据(往往是多次Receive操作所累积起来的,因为中间会有类似“粘包”的数据)分解为多个独立的消息,再处理。
      

  4.   

    自己组织数据结构(设置状态),封装类
    传文件的时候对文件的每块MD5执行验证,当传到Finish状态时,最后一次对两个文件的MD5做验证。如果相同就表示文件已经传输完毕
      

  5.   

    人家的设计是针对消息缓冲区里有多个独立消息的,你那个程序只有一个简单的消息。但是你的程序只是简单的文件内容,既没有传送其它属性,也没有传送结束标志。一个简单的.net解析post文件数据的源程序可以参考看:http://www.haogongju.net/art/581849