我想new一个Clent对象以后,让client一直保持连接。但是finally里ns.Close()以后,client就自己关闭了。
请问如何保证TcpClient的连接不关闭?
public class Client
{
private TcpClient client = new TcpClient();
client.Connect("Ip地址", "端口"); public void Post(byte[] b)
{
NetworkStream ns = null;
try
{
ns = client.GetStream();
//发送至服务器端
ns.Write(b, 0, b.Length);
ns.Flush();
}
catch
{
}
finally
{
                 if (ns != null)
                 {
                     ns.Close();
                     ns.Dispose();
                 }
}
}
}

解决方案 »

  1.   

    client难道不显示的close也会关闭吗?你这个类里的post方法执行完后,client应该没关啊。
    你调用client.Connected 是不是false。
      

  2.   

    刚才试了一下,确实这样,查Msdn,这样说:Stream.close()关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。
    所以,如果在finally里写这个ns.close(),一定就释放了connection,
    我最后改成
    ns = null;来替代你的close和disposed。你应该在最后释放,ns和connection,而不是每次调用Post都释放。
      

  3.   

    如果不关闭ns 那么你连续传递几次以后 程序就会在 ns.Write(b, 0, b.Length)这里卡住。
    你可以试一下。
      

  4.   

    这是俺的代码        private void button1_Click(object sender, EventArgs e)
            {
                TcpClient tcpClient = new TcpClient();
                IPAddress ipAddress = Dns.GetHostEntry("www.goldenstandard.com.cn").AddressList[0];
                IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 80);            tcpClient.Connect(ipEndPoint);            byte[] c = { 1 };
                for (int i = 0; i < 900; i++)
                {
                    Post(c, tcpClient);
                }
                
            }        public void Post(byte[] b,TcpClient client)
            {
                NetworkStream ns = null;
                try
                {
                    ns = client.GetStream();
                    //发送至服务器端
                    ns.Write(b, 0, b.Length);
                    ns.Flush();
                }
                catch
                {
                }
                finally
                {
                    if (ns != null)
                    {
                        string s2 = client.Connected.ToString();
                        ns = null;
                        //ns.Close();
                        //ns.Dispose();
                        string s = client.Connected.ToString();
                    }
                }
            }
      

  5.   

    除了程序,你的网络设备也可能关闭tcp链接
    试着在两台pc上先测试一下
      

  6.   

    kid_wang,你能把服务器端得代码贴出来看看吗?
    如果你上面是正确的话,那有可能是我服务器端接收出问题了。
    谢谢。
      

  7.   

    偶用SOCKET,一直都用同/异步的SEND和RECEIVE不存在楼主的那些问题用封装好的东西,就是为了图它的方便,如果楼主自定义要求太多,还是用原始的二进制通讯吧,效率和需求,往往会有冲突