客户端与服务器端TCP连接,关闭连接时应作的处理

客户端与服务器端通过TCP连接,客户端主动关闭连接时,会向服务器端发送一条信息,内容为null,据此,可在服务器端监听线程中如下处理:

None.gif if  (acceptSocket.Poll ( - 1 , SelectMode.SelectRead ))
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif 
if (acceptSocket.Available > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  tcpData.recSize 
= acceptSocket.Receive (tcpData.recData);
InBlock.gif  tcpData.sendSocket 
= acceptSocket;
InBlock.gif  tcpData.remoteEP 
= acceptSocket.RemoteEndPoint ;
InBlock.gif
InBlock.gif  ThreadPool.QueueUserWorkItem (
new WaitCallback (ProcessTCPData), tcpData);
ExpandedSubBlockEnd.gif }

InBlock.gif 
else
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
// 客户端关闭Socket时
InBlock.gif
  acceptSocket.Shutdown (SocketShutdown.Both );
InBlock.gif  acceptSocket.Close ();
InBlock.gif
InBlock.gif  strTemp 
= "\r\n关闭连接:" + strIP + ":" + strPort;
ExpandedSubBlockStart.gifContractedSubBlock.gif  
this.Invoke (new AddInfoDelegate (this.AddCMDInfo), new object [] dot.gif{strTemp});
InBlock.gif
InBlock.gif  
break;
ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

None.gif
None.gif

若想在服务器端关闭已与某个客户端建立连接的Socket,如下操作:

None.gif  acceptSocket.Shutdown (SocketShutdown.Both );
None.gif acceptSocket.Close ();

但会引发异常,故应在该Socket的监听线程中作如下处理:

None.gif    while  ( true )
ExpandedBlockStart.gifContractedBlock.gif   
dot.gif {
InBlock.gif    
try
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif     
if (acceptSocket.Poll (-1, SelectMode.SelectRead ))
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif{
InBlock.gif      
if (acceptSocket.Available > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif       tcpData.recSize 
= acceptSocket.Receive (tcpData.recData);
InBlock.gif       tcpData.sendSocket 
= acceptSocket;
InBlock.gif       tcpData.remoteEP 
= acceptSocket.RemoteEndPoint ;
InBlock.gif
InBlock.gif       ThreadPool.QueueUserWorkItem (
new WaitCallback (ProcessTCPData), tcpData);
ExpandedSubBlockEnd.gif      }

InBlock.gif      
else
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif       
// 对方关闭Socket时
InBlock.gif
       acceptSocket.Shutdown (SocketShutdown.Both );
InBlock.gif       acceptSocket.Close ();
InBlock.gif
InBlock.gif       strTemp 
= "\r\n关闭连接:" + strIP + ":" + strPort;
ExpandedSubBlockStart.gifContractedSubBlock.gif       
this.Invoke (new AddInfoDelegate (this.AddCMDInfo), new object [] dot.gif{strTemp});
InBlock.gif
InBlock.gif       
break;
ExpandedSubBlockEnd.gif      }

ExpandedSubBlockEnd.gif     }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif     
// 服务器端关闭Socket时
InBlock.gif
     strTemp = "\r\n关闭连接:" + strIP + ":" + strPort;
ExpandedSubBlockStart.gifContractedSubBlock.gif     
this.Invoke (new AddInfoDelegate (this.AddCMDInfo), new object [] dot.gif{strTemp});
InBlock.gif
InBlock.gif     
break;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif   }

None.gif
None.gif

转载于:https://www.cnblogs.com/bartholomew/archive/2005/11/30/287778.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过Qt的QSqlDatabase类来连接SQLite数据库。具体步骤如下: 1. 在Qt项目中包含SQLite驱动库文件(比如libsqlite3.so或sqlite3.dll); 2. 在代码中使用QSqlDatabase::addDatabase()方法添加SQLite数据库驱动; 3. 使用QSqlDatabase::setDatabaseName()方法设置要连接的SQLite数据库文件路径; 4. 调用QSqlDatabase::open()方法打开数据库连接; 5. 使用QSqlQuery类执行SQL语句进行数据库操作。 下面是一个简单的示例代码: ```cpp #include <QSqlDatabase> #include <QSqlQuery> #include <QDebug> int main() { // 添加SQLite数据库驱动 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // 设置要连接的SQLite数据库文件路径 db.setDatabaseName("/path/to/database/file.sqlite"); // 打开数据库连接 if (!db.open()) { qDebug() << "Failed to open database connection!"; return -1; } // 执行SQL语句进行数据库操作 QSqlQuery query; query.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)"); query.exec("INSERT INTO users (name) VALUES ('Alice')"); query.exec("INSERT INTO users (name) VALUES ('Bob')"); query.exec("SELECT * FROM users"); while (query.next()) { int id = query.value(0).toInt(); QString name = query.value(1).toString(); qDebug() << "id:" << id << ", name:" << name; } // 关闭数据库连接 db.close(); return 0; } ``` 在实际的Qt客户端中,你可以将以上代码封装成一个数据库管理类,提供连接、断开连接、执行SQL语句等方法,方便进行数据库操作。同,你也可以使用Qt的网络模块来实现TCP连接服务器端,将数据库操作请求发送给服务器端,由服务器端来实现对SQLite数据库的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值