要求:socket客户端向socket服务端发送一条SQL语句,并通过服务端程序向数据库中执行。
我本人提出解决方案,共大家探讨。
1.客户端向服务端发送自定义格式字符串,例如 00300005update aaa set bbb='c'
0030 发送字符总长度,0005 执行SQL语句最长时间, update aaa set bbb='c' 为实际要执行的SQL语句。
2.客户端等待服务端执行结果,等待最长时间为0005+2, 服务端接收到信息后,解析出要执行SQL语句最长时间“0005”与SQL语句“update aaa set bbb='c'”,数据库中已经写好了执行SQL语句的存储过程,存储过程有三个参数,分别为(执行最长时间、SQL语句、执行状态)。存储过程主要功能为,执行客户端传来的SQL语句。
3.如执行SQL语句错误则通过“执行状态”变量返出“执行错误”信息,并发送到客户端。 客户端根据此返回信息做出相应处理,
4.如SQL语句执行的时间大于0005秒,则存储过程回滚刚执行的SQL语句。并不向客户端发送认何信息。这时客户端,等待返回信息的时间必定会到0005+2秒,客户端就认为传送数据超时。 这样主要是为解决SQL语句执行时间大于了客户端的等待时间。
5.如SQL语句执行正确并在设定时间内执行完成,则向客户端返回执行成功信息。
6.当客户端收到“执行成功”信息后,则客户端删除已发送的信息。
7.客户端如收到,“执行错误”,则会发送下一条SQL语句,而错误SQL语句则等待人工处理。
8.客户端发送数据超时,则会重新发送此条SQL语句。 以上是我现在所用的socket传送机制,不知道我说的大家能否看明白。以上处理机制有几个问题,但我还不知道怎么解决。但出错的几率不高。第1问题,如SQL语句在设定时间内正确执行。并在返回客户端“成功执行”信息时,出现网络问题,此时客户端就无法收到“成功执行”信息,就会认为发送超时,但此时服务端其实已经成功执行了SQL语,当网络正常后,客户端会重新发送此SQL语句。
如果发送的SQL语句是"insert"插入语句,此时就会出现,发送数据重复的现象。
哈哈.....各位高人,看看谁有高招
我本人提出解决方案,共大家探讨。
1.客户端向服务端发送自定义格式字符串,例如 00300005update aaa set bbb='c'
0030 发送字符总长度,0005 执行SQL语句最长时间, update aaa set bbb='c' 为实际要执行的SQL语句。
2.客户端等待服务端执行结果,等待最长时间为0005+2, 服务端接收到信息后,解析出要执行SQL语句最长时间“0005”与SQL语句“update aaa set bbb='c'”,数据库中已经写好了执行SQL语句的存储过程,存储过程有三个参数,分别为(执行最长时间、SQL语句、执行状态)。存储过程主要功能为,执行客户端传来的SQL语句。
3.如执行SQL语句错误则通过“执行状态”变量返出“执行错误”信息,并发送到客户端。 客户端根据此返回信息做出相应处理,
4.如SQL语句执行的时间大于0005秒,则存储过程回滚刚执行的SQL语句。并不向客户端发送认何信息。这时客户端,等待返回信息的时间必定会到0005+2秒,客户端就认为传送数据超时。 这样主要是为解决SQL语句执行时间大于了客户端的等待时间。
5.如SQL语句执行正确并在设定时间内执行完成,则向客户端返回执行成功信息。
6.当客户端收到“执行成功”信息后,则客户端删除已发送的信息。
7.客户端如收到,“执行错误”,则会发送下一条SQL语句,而错误SQL语句则等待人工处理。
8.客户端发送数据超时,则会重新发送此条SQL语句。 以上是我现在所用的socket传送机制,不知道我说的大家能否看明白。以上处理机制有几个问题,但我还不知道怎么解决。但出错的几率不高。第1问题,如SQL语句在设定时间内正确执行。并在返回客户端“成功执行”信息时,出现网络问题,此时客户端就无法收到“成功执行”信息,就会认为发送超时,但此时服务端其实已经成功执行了SQL语,当网络正常后,客户端会重新发送此SQL语句。
如果发送的SQL语句是"insert"插入语句,此时就会出现,发送数据重复的现象。
哈哈.....各位高人,看看谁有高招
如果服务器接收不到回执消息, 则认为客户端没有接收到"成功执行"的消息, 服务器要记录好这件事: <客户端没有接收到本次成功执行的消息>;
如果下次再有客户端连接服务器, 要求执行SQL语句时, 先检查是否是以前的 <客户端没有接收到本次成功执行的消息> 的那条消息;
如果是: 则不执行, 直接返回"成功执行"消息;其实网络通讯(socket)还是有些麻烦的: 主要解决好以下几个问题:
1. 如果你是多客户端连接怎么处理 ?
2. 与客户端来回消息的交换用阻塞式还是非阻塞式?
3. 肯定要用到线程的...
还有心跳包。通讯协议一般就是这几个处理:login[可选], logout[可选],上行数据包,下行数据包,心跳包
上下行数据包再细分是具体协议内容,自行定义。
将这几个协议数据定义包,有啥问题不可行的?我认识到的通讯协议基本就这样。HTTP,FTP,SMTP基本如此,就是其它也可以这样理解。