我正在构建一个基于服务器和基于客户端的应用程序,它通过套接字(典型的东西)进行通信。C#客户端/服务器套接字在断开连接后将不会再次连接
预期的功能是客户端连接,它们来回发送一些数据,然后客户端关闭连接。一段时间后,客户端重新连接,他们来回发送更多信息,并再次断开连接。
该过程的第一步正常工作。客户端连接,BeginAccept根据需要熄灭,并且他们聊了一会儿。连接似乎关闭就好(Disconnect()),逻辑运行并再次调用BeginAccept。但是,如果客户端尝试再次连接,AcceptCallback将不会触发。
在线其他问题/答案建议套接字需要恢复,但我这样做。
在真实版本(这里修剪)我有广泛的异常处理和日志记录,但没有任何例外或错误的工作。
如果我重新启动服务,它将再次运行(但只有一次),这导致我相信这是我的服务器代码,而不是我的客户端。 看来AsyncCallback根本不会再被触发。
我做错了什么,所以我不能连接多次? 谢谢!
在服务器上,在一个线程我有以下(这被称为在一开始,以及当切断信号从客户端发送):
try
{
//check connected, and if not connected, then close socket and reopen
if (mDisconnectFlag == true)
{
mDisconnectFlag = false;
this.Disconnect();
}
if (listener == null || listener.Connected == false)
{
// Create a TCP/IP socket.
this.listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
// Bind the socket to the local endpoint and listen for incoming connections.
this.listener.Bind(localEndPoint);
this.listener.Listen(10);
// Start an asynchronous socket to listen for connections.
this.listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
}
else if (listener.Connected == false || mAcceptCallBackFlag == true)
{
// Start an asynchronous socket to listen for connections.
this.listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
}
// Wait until a connection is made before continuing.
_retevent = ProcessSocketEvent.WaitOne(mSocketProcessTimeInterval, false);
}
catch (Exception ex)
{
//logging - don't worry about this
}
断线如下:
public void Disconnect()
{
try
{
this.listener.Shutdown(SocketShutdown.Both);
this.listener.Disconnect(false);
this.listener.Dispose();
listener = null;
}
catch (Exception ex)
{
//logging
}
}
最后,回电:
public void AcceptCallback(IAsyncResult ar)
{
try
{
// Get the socket that handles the client request.
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
this.listener = handler;
// Create the state object.
StateObject state = new StateObject();
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
mAcceptCallBackFlag = true;
}
catch (Exception ex)
{
//logging
}
}
感谢您提供有关BeginAccept()的信息。我给出的第一个代码片段是循环运行的。所以我再次调用BeginAccept()。但是,我应用了您的第一个建议并停止了循环,并且它可以正常工作。 – Jonathan