要求: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.   

    方案好象没有什么大问题, 关键是在网络通讯上面要做好安全文章;你最后的问题其实很简单: 多做一次来回校验: 服务器向客户端发送"成功执行"消息, 要等客户端回执;
        如果服务器接收不到回执消息, 则认为客户端没有接收到"成功执行"的消息, 服务器要记录好这件事: <客户端没有接收到本次成功执行的消息>;
     如果下次再有客户端连接服务器, 要求执行SQL语句时, 先检查是否是以前的 <客户端没有接收到本次成功执行的消息> 的那条消息;
     如果是: 则不执行, 直接返回"成功执行"消息;其实网络通讯(socket)还是有些麻烦的: 主要解决好以下几个问题:
      1. 如果你是多客户端连接怎么处理 ?
      2. 与客户端来回消息的交换用阻塞式还是非阻塞式?  
      3. 肯定要用到线程的...
      

  2.   

    写通信程序,协议理解是最基本的,这不需要高招,你想像一下HTTP协议实现,你有未知的,就是request,server给你一个response,就这么简单,你将request多做几种情况,就完事了,这个是最基本的吧???想一次request做完所有事??那就继续想吧。
      

  3.   

    嗯,还涉及一个概念,好像叫窗口滑动,就是request在N时间内未返回response,则继续request,M次后未收到response,则认为连接断开。
    还有心跳包。通讯协议一般就是这几个处理:login[可选], logout[可选],上行数据包,下行数据包,心跳包
    上下行数据包再细分是具体协议内容,自行定义。
    将这几个协议数据定义包,有啥问题不可行的?我认识到的通讯协议基本就这样。HTTP,FTP,SMTP基本如此,就是其它也可以这样理解。