在我的Datasnap客户端应用程序中,我使用1个TSQLConnection作为我的方法和ProviderConnection.连接丢失时出现问题.TSQLConnection.Connected和TSQLConnection.ConnectionState都没有捕获到它.
当我的TSQL连接打开但我丢失了互联网连接,或者服务器停止.Datasnap客户端应用程序提供了大量错误.(服务器方法或ClientDatasets)
我已经创建了一个函数来管理我的服务器方法的SQL连接.但是当例如关闭通过TDSProviderConnection连接的ClientDataset时会出现更多问题.
问:如何管理客户端应用程序以安全地捕获TSQL连接上的任何断开连接. 问:如何管理停机时间,以及如何处理未保存的客户端状态.
停机后重新连接不是问题.
调用servermethod时:这会抛出异常.
tmpM:=TServerMethodsClient.Create(MYTSQLCONNECTION.dbxconnection,true);
Run Code Online (Sandbox Code Playgroud)
所以我写下一个方法,用虚方法从我的数据模块中获取TSQLCONNECTION.
function TDMForm.DSConnection: TSQLConnection;
var
tmpM:TServerMethodsClient;
begin
result:=nil;
if assigned(MYTSQLCONNECTION) then begin
tmpM:=TServerMethodsClient.Create(MYTSQLCONNECTION.dbxconnection,true);
try
try
tmpM.Ping;
result:=MYTSQLCONNECTION
except
ReconnectForm.ShowModal; // has a reconnect button that tries to reconnect + shutdownbutton
if ReconnectForm.modalresult=mrOK then
result:=MYTSQLCONNECTION
else
MainForm.Close;
end;
finally
tmpm.Free;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我用这种方式写了这个方法,因为只有找出连接是否丢失的方法是通过伪方法,它会抛出相同的错误...然后我可以查询重新连接或关闭程序.
编辑:(我期待某种一般的答案和指导方针,做和不做.不是我的代码的更正,这只是为了表明我现在在做什么.)
我正在用C#开发一个服务器,它只能接受一个客户端,我需要知道这个客户端什么时候断开连接才能接受另一个连接请求.
我正在使用第一个Socket,它持续监听连接请求Socket.BeginAccept并接受或拒绝客户端.当接受客户端时,返回的新Socket Socket.EndAccept用于客户端和服务器之间的通信.然后,服务器等待来自客户端的命令Socket.Begin/EndReceive并发送响应.服务器使用类似Telnet的协议,这意味着每个命令和每行响应必须以\r\n.
为了检测客户端是否已断开连接,我安装了一个定时器,每500ms \r\n向客户端发送一条空消息(" ").如果客户端断开连接,则Socket会抛出异常.服务器捕获此异常,该服务器关闭当前会话并接受新连接.此解决方案是健壮的,但意味着网络上不需要的流量,必须由客户端正确处理,客户端必须在获得实际响应之前过滤虚拟消息.
我试图发送一个空缓冲区(Socket.Send(new byte[1], 0, 0)),但它似乎在方向server-> client中不起作用.
另一种解决方案可能是处理Socket.EndReceive返回0字节的情况.它适用于在"空闲"时间内发生断开连接的情况.但是,如果客户端在传输消息期间断开连接,则服务器并不总是看到它并无限期地等待.
我已经看到了关于这个问题的几个线索和问题,但我从未见过任何好的解决方案.
所以我的问题是:在.Net中检测断开连接的最佳方法是什么?
我有一个客户端服务器的情况,客户端打开到服务器的TCP套接字,有时很长一段时间将通过它们之间没有数据发送.我遇到了一个问题,服务器试图将数据发送到客户端,它似乎成功,但客户端从未收到它,几分钟后,它看起来像客户端断开连接.
我是否需要每隔一段时间发送一些保持活动包?
编辑:要注意,这是在同一台计算机上的同行.计算机位于NAT后面,可以转发用于此计算机的一系列端口.与服务器连接的客户端通过DNS打开连接.即它使用mydomain.net和端口进行连接.
我正在尝试创建一个Flask服务器,使用sse将数据流式传输到客户端.下面的测试代码似乎可以解决问题,但我偶然发现了与处理客户端断开连接相关的问题.
使用Firefox作为客户端(版本28或29)时,数据按预期开始流式传输.但是,当我重新加载页面时,会打开一个新流(如预期的那样),但旧流仍然存在.处理流的eventgen()线程永远不会终止.在其他客户端上(我尝试使用Yaffle的Polyfill EventSource实现以及Chrome),重新加载或关闭页面会导致客户端断开连接,从而导致服务器端套接字错误10053(客户端与主机断开连接).这将终止循环并仅使活动流保持活动状态,这是预期的行为.
使用Process Explorer,我注意到客户端(Firefox)端的TCP连接挂起状态FIN_WAIT2,而服务器端的连接挂起状态CLOSE_WAIT.奇怪的是,在运行Firefox的3台机器中的1台(所有Win 7 x64)上我测试了这一点,断开连接正确处理.在Python 2.6.5和2.7.6上运行产生了相同的结果.
我还尝试用基于greenlet的gevent WSGIserver替换内置的Flask服务器,但这会产生完全相同的行为.此外,应该使用某种形式的线程/ eventlet,因为否则运行eventgen()循环会阻塞服务器.
下面的测试代码在浏览到localhost:5000时为make_html()中定义的页面提供服务,并打开一个到/ stream的流.该流显示格式{"content":0.5556278827744346,"local_id":4,"msg":6}的按摩,其中local_id是打开的流的id,msg是此流中当前消息的编号.
import time, random
import flask
from flask import Flask, json
def make_html():
return """
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script type=text/javascript>
var source = new EventSource('/stream');
source.onmessage = function (event) {
var data = event.data;
var logdiv = $('#log');
logdiv.empty();
logdiv.append('<div class="event">' + data + '</div>');
};
</script>
<h1>Log</h1>
<div id=log>Log ...</div>
<hr />
"""
# ---- Flask app ----
app = Flask(__name__)
@app.route('/')
def index():
return make_html()
counter …Run Code Online (Sandbox Code Playgroud) 在这样的代码中
using (var sftp = new SftpClient(_host, _userName, _password))
{
sftp.Connect();
// Do some work with sftp
sftp.Disconnect();
}
Run Code Online (Sandbox Code Playgroud)
sftp.Disconnect() 调用是必要的还是会使用块(处置/关闭/任何)自动关闭连接?
我花了很多年的时间试图找到一个简单的例子,其中使用了MongoEngine并且关闭了连接.终于想出来并发布了我的代码.
你disconnect会把部分代码称为线路噪音,还是将它保留原样?
use DBI;
my $dbh = DBI->connect ...
...
...
END {
$dbh->disconnect or die $DBI::errstr if $dbh;
}
Run Code Online (Sandbox Code Playgroud) 那么iOS6及其如何处理蓝牙LE断开是怎么回事?在设备立即断开之前,但由于某些奇怪的原因,设备等待断开约30-60秒.我需要它来断开ASAFP!
我一直在互联网上试图弄清楚如何立即断开与外围设备的连接,我发现这个漂亮的电子邮件解释了一种解决方法是取消订阅有关服务特性的通知.
现在我想我正在那样做...当我想断开连接时我打电话 [connected_device setNotifyValue:NO forCharacteristic:connected_characteristic]
然后,在didUpdateNotificationStateForCharacteristic函数中,我有......
if((int)characteristic.isNotifying == 0){
[manager cancelPeripheralConnection:peripheral];
}
Run Code Online (Sandbox Code Playgroud)
在函数didDisconnectPeripheral中......
connected_peripheral = nil;
connected_characteristic = nil;
[connected_peripheral release];
[connected_characteristic release];
Run Code Online (Sandbox Code Playgroud)
我也很好地看了一下Apple的CoreBluetooth温度传感器示例,但它并没有真正帮助太多....
对此的任何帮助都会很棒!! 我只是不知道我错过了什么.....
更新:看起来应用程序需要连接到蓝牙设备至少一分钟才能断开连接.如果应用程序连接超过一分钟,它将在发送命令时立即断开连接.否则,它将等到那一分钟标记实际断开.
更新:当我尝试在一分钟标记之前断开连接时,当设备实际断开连接时,我将以下输出到日志.
Oct 24 16:49:35 Christophers-iPhone awdd[8168] <Error>: libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionary
Oct 24 16:49:35 Christophers-iPhone awdd[8168] <Error>: CoreLocation: CLClient is deprecated. Will be obsolete soon.
Run Code Online (Sandbox Code Playgroud) 我为此分配了一个插槽.
...
self.query = QtGui.QLineEdit(self)
self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.connect(lambda: self.launchNavigator(1))
...
Run Code Online (Sandbox Code Playgroud)
但我怎么能断开连接?我试过这个,但它不起作用......
self.query.textChanged.disconnect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.disconnect(lambda: self.launchNavigator(1))
Run Code Online (Sandbox Code Playgroud) 我已经注册了一个广播接收器,PHONE_STATE因此每当呼叫断开时我就可以执行代码。我正在尝试查找断开连接的原因,我相信可以通过致电找到Call.Details.getDisconnectCause。问题是我如何检索与Call刚刚断开的呼叫相关的类实例。
以下是我看过但尚未找到解决方案的一些链接:
谢谢
disconnect ×10
python ×3
sockets ×2
tcp ×2
.net ×1
android ×1
c# ×1
connection ×1
datasnap ×1
dbi ×1
delphi ×1
delphi-xe2 ×1
event-stream ×1
firefox ×1
flask ×1
idisposable ×1
ios6 ×1
mongoengine ×1
perl ×1
pyqt ×1
signals ×1
slot ×1
sql ×1
ssh.net ×1
telephony ×1
timeout ×1
using ×1