我已经在C#中创建了一个异步服务器,以配合我的Android应用程序。该服务器类似于这个链接:http://msdn.microsoft.com/en-us/library/fx6588te.aspx。
它能很好地工作,并且我可以让许多客户端同时连接并从服务器接收数据。但是我发现一个问题,如果在Android应用程序中已经通过Wifi连接并再次按下连接按钮,则服务器会生成一个新的套接字。服务器应该先关闭旧连接,然后创建新连接。在Android端,我确保调用
我想不出为什么我的服务器没有关闭旧连接。打开的连接数应该与连接到服务器的设备数量相同。如果这是一个线程阻塞的服务器,那么只需关闭线程即可,但在这种情况下我不确定该怎么做。
编辑:所以我让CurrPorts程序放置一段时间后刷新了一下,已建立的连接数减少到了一个。我的解决方案对吗?只是Windows需要一段时间才能清除创建的旧套接字连接?
它能很好地工作,并且我可以让许多客户端同时连接并从服务器接收数据。但是我发现一个问题,如果在Android应用程序中已经通过Wifi连接并再次按下连接按钮,则服务器会生成一个新的套接字。服务器应该先关闭旧连接,然后创建新连接。在Android端,我确保调用
close()
,甚至将其设置为null。我还向服务器发送断开控制信号,以便它也可以在套接字上调用close()
。例如,以下是我在服务器中执行此操作的方式:if (state.storage.parseJson(content) == JsonStorage.DISCONNECT)
{
Console.WriteLine("Disconnect2!");
state.workSocket.Shutdown(SocketShutdown.Both);
state.workSocket.Close();
return;
}
当我在一个叫做“CurrPorts”的程序中检查我的服务器进程时,它显示有几个连接打开到不同端口的Android设备。我使用Timer对象向客户端发送数据,并检查连接是否活动,否则我会关闭它。例如,我的TimerCallback方法:
public void TimeCallBack(object input)
{
StateObject state = (StateObject)input;
if (state.workSocket.Connected)
{
Send(state.workSocket, state.storage.getJson());
}
else
{
Console.WriteLine("Dispose!");
state.timer.Dispose();
state.workSocket.Close();
}
}
我想不出为什么我的服务器没有关闭旧连接。打开的连接数应该与连接到服务器的设备数量相同。如果这是一个线程阻塞的服务器,那么只需关闭线程即可,但在这种情况下我不确定该怎么做。
编辑:所以我让CurrPorts程序放置一段时间后刷新了一下,已建立的连接数减少到了一个。我的解决方案对吗?只是Windows需要一段时间才能清除创建的旧套接字连接?