我在winform中的按钮点击事件中新建了一个局部变量serveScoket,开启监听,在方法结束后,我新建一个客户端连接仍然可以连接到服务器,这是为什么?
private void btnStart_Click(object sender, EventArgs e)
{
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()),int.Parse(txtPort.Text.Trim())));
server.Listen(10);
txtReciveMsg.Text = "服务器开始监听...\r\n" + txtReciveMsg.Text;
}
因为 Socket是 “非托管”资源。 就是说,在.net框架中 的垃圾回收机制,是对这个对象不起作用的。
所以 说,你的方法结束了,它还不会自动消失。
非托管 资源需要你调用 它 释放自己的方法
这让人怎么回答呢?如果真的是侦听一次,那么你在做网络程序的时候,你要一直点击按钮?
额。。我是不懂为什么局部变量释放后还能继续监听。。。
如果把这个serverSocket是类的全局变量或者成员变量才能监听,就没什么疑问了
因为这是一个异步方法,socket也有同步的方法,我之前用过。如果你不想让它监听了,把它close就好了。socket属于com组件类的,不会自动释放,需要手动回收。
我想它应该可以用using来声明的
你有没有测试过,方法结束后经过多少时间间隔客户端没法连接到服务器了?
只要服务器程序不退出,就一直可以连接的
@陌影: 在 Listen 后调用 server.Dispose()。
它是一个线程,即使退出了,它还在后台运行的。