解决方案 »

  1.   

    namespace WindowsFormsApplication1
    {
        class DataReadWrite
        {
            public TcpClient client;
            public NetworkStream ns;
            public byte[] read;
            public byte[] write;
           
            public DataReadWrite(TcpClient client)
            {
                this.client = client;
                ns = client.GetStream();
                read = new byte[client.ReceiveBufferSize];
                write = new byte[client.SendBufferSize];
            }
            public void InitReadArray()
            {
                read = new byte[client.ReceiveBufferSize];        }
            public void InitWriteArray()
            {
                write = new byte[client.SendBufferSize];
            }
            public EndPoint returnIP()
            {
                return client.Client.RemoteEndPoint;
            }
        }
    }这是上面出现的DataReadWrite的一个类
      

  2.   

    发送文件的时候,为什么等到发送完成后,才执行回调函数,而且是连续执行类里这个函数
    private void SendCallBack(IAsyncResult iar)
            {
                DataReadWrite datareadwrite = (DataReadWrite)iar.AsyncState;
                try
                {
                    datareadwrite.ns.EndWrite(iar);
                    //datareadwrite.InitWriteArray();
                    //datareadwrite.ns.Close();
                }
                catch (Exception e)
                {
                    //MessageBox.Show("出错了");
                    //  listBoxStatus.Invoke(setlistboxcallback,e.ToString());
                    //  comboBox1.Invoke(removecomboboxcallback,datareadwrite);
                }
                finally
                {                //datareadwrite.ns.Close();
                }
            }
      

  3.   


    没工夫看你的代码了。你可以写上几条7、8行c#代码,用.net客户端访问一下,看看能不能重现问题。如果只是java客户端的问题,那么应该去修改客户端程序,而不是服务器。
      

  4.   


    没工夫看你的代码了。你可以写上几条7、8行c#代码,用.net客户端访问一下,看看能不能重现问题。如果只是java客户端的问题,那么应该去修改客户端程序,而不是服务器。我想知道 异步发送的时候,回调函数什么时候调用呢?还有为什么我服务器套接字一关闭,客户端能正常接收到文件呢?很是不解
      

  5.   

    c#客户端用的异步,没有问题,java客户端
    private void receiveFile(DataInputStream in, String localFile,int len1)
    throws Exception {
    // 获取socket的输入流并包装成BufferedInputStream
    try { // Thread.sleep(10000);
    // BufferedInputStream in = new BufferedInputStream(
    // socket.getInputStream()); File file = new File(localFile);
    // 获取与指定本地文件关联的文件输出流
    FileOutputStream out = new FileOutputStream(file); byte[] buf = new byte[Buffer];
    int len = 0;
    // 反复读取该文件中的内容,直到读到的长度为-1
    while ((len = in.read(buf)) != -1) {

    out.write(buf, 0, len); // 将读到的数据,按读到的长度写入输出流 }
    out.flush();
    out.close();
    in.close(); } catch (Exception e) {
    System.out.println(e.toString());
    }
    }
    这段代码接收的
      

  6.   


    发送完毕(对于tcp来说,基本上就是数据准确而完整滴到达对方的操作系统网卡驱动层)就会回调。如果连通,那么可能在3毫秒以后,也可能在3秒钟以后回调。至于说“我服务器套接字一关闭,客户端能正常接收到文件”,我从来没有听说过这个规则。这只有在“程序编写出错”的情况下才会。
      

  7.   

    忠告你两句:把你一大堆用 // 注释掉的 c#语句清理干净,这些全都删除掉。
    把你的所有无关 try...catch...finally代码 删除掉,或者使用条件编译语句使其只有在Release时才出现(在DEBUG时并不出现)。
      

  8.   

    7楼正解,为什么服务端不传个长度下去呢?客户端根本不知道什么时候文件结束,只好判断-1,-1就是socket断开了。
      

  9.   

    Quote: 引用 9 楼 guxingfeiyu 的回复:

    7楼正解,为什么服务端不传个长度下去呢?客户端根本不知道什么时候文件结束,只好判断-1,-1就是socket断开了。[/quote 有道理
      

  10.   


    发送完毕(对于tcp来说,基本上就是数据准确而完整滴到达对方的操作系统网卡驱动层)就会回调。如果连通,那么可能在3毫秒以后,也可能在3秒钟以后回调。至于说“我服务器套接字一关闭,客户端能正常接收到文件”,我从来没有听说过这个规则。这只有在“程序编写出错”的情况下才会。刚才我做了个测试,发送的时候加了个延迟,回调函数一步步执行了,而不是到最后一起执行