- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个通过套接字(典型的东西)进行通信的基于服务器和客户端的应用程序。
预期的功能是客户端连接,它们来回发送一些数据,然后客户端关闭连接。一段时间后,客户端重新连接,他们来回发送更多信息,然后再次断开连接。
该过程的第一步运行良好。客户端连接,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()
了。确实,您在建立第一个连接后就立即丢弃了原始的监听套接字。
关于如何编写基于套接字的网络代码,有很多正确的示例,因此,我不会赘述。特别是,由于这里没有好的Minimal, Complete, and Verifiable code example可供使用。但是,在您发布的代码中,似乎需要进行的主要更改是替换:
this.listener = handler;
和:
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);
}
而且没有什么可以设置您在此处等待的
ProcessSocketEvent
的:
_retevent = ProcessSocketEvent.WaitOne(mSocketProcessTimeInterval, false);
如果这不是您已省略的代码部分,则应摆脱
WaitOne()
调用,或确保已设置事件句柄。同样,尚不清楚该代码的目的是什么。如果您处在希望再次调用
BeginAccept()
的循环中,则说明您混合了各种示例(不幸的结果是,当人们遵循MSDN套接字示例时,有时会发生这种情况,这是可怕的)。如果要在循环中进行阻止和接受,只需使用同步
Accept()
方法。如果要使用
BeginAccept()
,则不需要循环。只需在完成回调方法中调用
BeginAccept()
之后再调用
EndAccept()
即可。
关于c# - 断开连接后,C#客户端/服务器套接字将无法再次连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46436459/
是否可以在蓝牙设备连接到 iOS 或从 iOS 断开连接时收到通知,即使我的应用程序处于后台?在 Android 上,我使用 ACTION_ACL_CONNECTED 和 ACTION_ACL_DIS
我对使用 Delphi 使用 USB 设备感到不舒服,并且对编写设备驱动程序的细节几乎一无所知(尽管我在学习使用 GoASM 进行汇编时遇到过一些)。 该设备可以是 USB 调制解调器或 USB 打印
我正在使用 java/servlet 和前端 JSP 开发 Web 应用程序。 我的页面为用户显示一些信息。 是否有任何适当的方法来检查网络连接是否处于 Activity 状态(开/关)以及支持所有浏
这个问题在这里已经有了答案: C# -- TcpListener.Start() causing SocketException with message "Only one usage of ea
我想向我的应用程序添加功能,以允许在 Windows 操作系统上检测播放/捕获设备的到达和断开连接。就像在 Skype 中一样 - 当您拔下设备时 - 它会显示设备丢失的通知,例如要求您选择另一个。
如何断开 org. apache. http. client.HttpClient 对象? 我正在这样创建它,但它没有任何 disconnect() 或 getHttpConnectionManage
我们正在开发一个 .NET 应用程序,其中一个要求是监视系统是否连接到 Internet。 我们能够获得“以太网电缆断开连接”的 .NET 事件,但如果调制解调器被重置,则不会触发此事件。我不想一直通
我正在尝试与使用自签名证书的后端服务器建立 websocket 连接。在 Firefox 中,我为自签名证书添加了一个异常(exception)。 但是我的 websocket 连接 wss://连接
我正在使用由 Excel 生成的用户窗体来修改 PowerPoint 演示文稿(这是避免需要启用宏的电子表格的迂回方法)。该表单工作得很好,但每次我将焦点放在它上时,Excel 应用程序都会获得焦点(
您好,我成功地开始了视频通话,但是当我断开视频通话时,摄像头 LED 指示灯仍然亮着。我怎样才能完全断开通话? Video.createLocalVideoTrack().then(track =>
您好,我成功地开始了视频通话,但是当我断开视频通话时,摄像头 LED 指示灯仍然亮着。我怎样才能完全断开通话? Video.createLocalVideoTrack().then(track =>
我正在尝试断开客户端与服务器的连接,但服务器仍将其视为已连接。我找不到解决这个问题的方法,关机、断开连接和关闭都不起作用。 我与客户端断开连接并检查服务器的一些代码: 客户: private vo
我正在使用 magic record 来完成我所有的核心数据工作。 一切都很好,除了有时我在后台进行更新时我需要从上下文中分离或断开实体。 例如 ButtonList = [Buttons MR_fi
我正在尝试实现一个颜色选择器,它从屏幕上各处的像素中获取颜色。为此,我计划使用全局鼠标 Hook 来监听 WM_MOUSEMOVE,以便在鼠标四处移动时更新颜色,并监听鼠标点击以确认 (WM_LBUT
我有一个使用 C# 编写的 TLS 连接的客户端/服务器 TCP 场景。 客户端在安静并恢复后无法传递消息(不活动时间约为 25 分钟)。但如果我让客户聊天(每 30 秒),就没有问题。 客户端和服务
我编写的这段代码完美运行,但我担心每 2 秒执行一次 ping 操作会消耗太多资源,或者可能导致互联网连接出现一些问题。 new Thread(() => {
关闭带有附加 MediaPlayer 的 MediaController 的正确方法是什么? 您不能执行 mediaController.setMediaPlayer(null) - 立即调用 upd
从我的笔记本电脑上断开外接显示器后,我丢失了一些应用程序,因为断开连接的显示器仍设置为默认显示器。我的一些窗口试图在断开连接的显示器上显示。 我有一个解决方法,例如右键单击应用程序图标并选择移动,然后
是否可以将分片节点从分片集中取出并独立运行? 例如,每个分片都有一个特定的客户。 谢谢。 最佳答案 是的,这是可能的。 MongoDB“主”节点不知道分片。只有路由器(和配置服务器)知道。如果您使用正
我正在探索 Cassandra 及其复制系统。为此,我在本地创建了 3 个节点并测试了不同的场景。我想暂停节点之间的通信,用相同的键写入不同的值,然后观察它们将决定什么。 那么问题来了:如何限制节点在
我是一名优秀的程序员,十分优秀!