×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

不太明白你说的异步方式是指何种方式。我做过一种异步方式,要求server执行完来自client的命令后回发一个report给client。流程见内,比较复杂,不一定适用,仅供参考。

client端程序设立一个数组(或者说结构数组,取决于具体业务数据形式)作为滑动窗口,数组深度用来限定异步处理记录的能力。每个数组元素有report标志和时间标志(处理超时)。程序流程如下:
1. 检查滑窗中是否有超时的记录(未得到report响应),如果有则删除(或者重新发送,取决于业务逻辑)。如果滑窗已满,则跳至step3。
2. client检查是否有待发命令。如果有,则发出命令,并将发出报文写入滑动窗口,report标志为空(表示未响应)。
3. client进入block方式接收数据。如果收到数据,则判断是ACK,report还是server的命令。如果是ACK,在滑窗中找到对应记录,置位report标志,设置时间标志; 如果是report,在滑窗中找到对应记录,删除之(表示此交易完结)。如果是server命令,发送ACK并处理命令.
4. 转step 1
Report

Replies, comments and Discussions:

  • 工作学习 / 专业技术讨论 / 我有一个socket的问题请教大家,我希望在client-server只见建立一个tcp socket连接,画面可以随时利用这个socket连接给server发送各种命令,并block模式等待response。
    同时server端可能不定期地给各个客户client发送各种命令。这种情况是不是只能采用异步方式?
    • 不太明白你说的异步方式是指何种方式。我做过一种异步方式,要求server执行完来自client的命令后回发一个report给client。流程见内,比较复杂,不一定适用,仅供参考。
      client端程序设立一个数组(或者说结构数组,取决于具体业务数据形式)作为滑动窗口,数组深度用来限定异步处理记录的能力。每个数组元素有report标志和时间标志(处理超时)。程序流程如下:
      1. 检查滑窗中是否有超时的记录(未得到report响应),如果有则删除(或者重新发送,取决于业务逻辑)。如果滑窗已满,则跳至step3。
      2. client检查是否有待发命令。如果有,则发出命令,并将发出报文写入滑动窗口,report标志为空(表示未响应)。
      3. client进入block方式接收数据。如果收到数据,则判断是ACK,report还是server的命令。如果是ACK,在滑窗中找到对应记录,置位report标志,设置时间标志; 如果是report,在滑窗中找到对应记录,删除之(表示此交易完结)。如果是server命令,发送ACK并处理命令.
      4. 转step 1
      • step 2,3描述有误,更正如下:
        1. 检查滑窗中是否有超时的记录(未得到report响应),如果有则删除(或者重新发送,取决于业务逻辑)。如果滑窗已满,则跳至step3。
        2. client检查是否有待发命令。如果有,则发出命令,并将发出报文写入滑动窗口,时间标志设为空。
        3. client进入block方式接收数据。如果收到数据,则判断是ACK,report还是server的命令。如果是ACK,在滑窗中找到对应记录,report标志置为空(表示未响应),设置时间标志; 如果是report,发送ACK,在滑窗中找到对应记录,删除之(表示此交易完结)。如果是server命令,发送ACK并处理命令.
        4.4. 转step 1
        • 对,你描述的流程和我的要求基本上是一致的。我原来也想用一个结构数组来标示每一个等待发送的命令和把异步接受的流解析后和发送的command来匹配。
          后来像这样比较复杂,就准备把从服务器断受到的流解析后,全部发给winform,具体处理就交个winform了。
          谢谢你回答!
        • If no data come from server, your client is blocked. The window may not get refreshed. And user cannot drag the window.
          I will create two thread, one for sending, one for receiving. Main thread is the producer for sending thread, is the consumer for receiving thread.
      • why array insteadof linked list? since most operations on the data are insert, delete and match (use hashtable if needed).
    • server端可能不定期地给各个客户client发送各种命令--multicasting比较适合,用单独的thread处理。