线程1和2的工作内容一致线程1可以独立完成发送完数据后,直接判断缓冲区是否满,满了直接发送

解决方案 »

  1.   

    同上,线程1和2必须合并,否则无法同时操作同一个端口.
    多线程访问同一资源,要加锁.
      

  2.   

    谢谢两位指点。
    那如果是定时呢,比如时间到了,但是线程1还在发送状态。
      

  3.   

    你应该用2个时间变量相减,来判断是否已经超时,而不是在某个时间点上固定执行.
    否则1正在发送,你2也要从同一个端口发送,不是依然要等待么,让1自己判断超时并发送,有什么区别
      

  4.   


    多谢!
    另外,我在考虑,需不需要用一个线程只负责监听接收服务器发来的数据,再用一个独立的线程处理接收的数据,包括拆包,存入消息队列B。 线程的数量,应该是在满足要求的情况下,越少越好吧?
      

  5.   

    合并线程1,2之后,设置线程3的优先级较高。在客户端发出发送数据请求的同时,如果有服务器发送数据请求,是否可以通过优先级高,确保服务器请求被优先执行?
      

  6.   

    所谓线程优先级,是指线程切换的时候,哪个更优先执行,而跟任务是否优先执行无关.
    既然你要合并1和2,那么一次只能发送1个数据,到底发送哪个数据,自己做个判断不就好咯,
    就是不要每次从队列里顺序取,而是先判断是否有服务器请求,有就拿出来执行,没有再顺序取只有1个发送线程,设置不设置优先级有区别?
      

  7.   

    多谢。
    那要这样的话,是不是线程3也可以不需要?整个程序一个线程就足够了,先判断是否有服务器请求,有的话拿来执行,没有的话顺序取发送消息队列中的消息发送出去。
      

  8.   

    如果请求不是非常多的话,这样做是完全可行的.
    就是侦听到数据来到,然后就直接发出去,连压入队列都省了.但是如果数据时多时少,则需要一个单独的线程,将接收到的信息先压入队列,然后慢慢处理.如果数据一直非常多,即使压入队列了,也处理不过来,就只能考虑开多线程分别处理了.当然多线程分别处理发送,你就要为每个线程单独开一个端口去发送,而不能所有线程都使用同一个端口,否则是没有意义的
      

  9.   

    如果请求不是非常多的话,这样做是完全可行的.
    就是侦听到数据来到,然后就直接发出去,连压入队列都省了.但是如果数据时多时少,则需要一个单独的线程,将接收到的信息先压入队列,然后慢慢处理.如果数据一直非常多,即使压入队列了,也处理不过来,就只能考虑开多线程分别处理了.当然多线程分别处理发送,你就要为每个线程单独开一个端口去发送,而不能所有线程都使用同一个端口,否则是没有意义的
    谢谢。
    不用多线程分别处理发送。发送队列A是业务程序生成的,通讯程序只负责打包,对于需要及时发送的,立即发送;对于不需要及时发送的,存入缓冲区,等缓冲区满了,再发送缓冲区内容。
    如果用两个线程,一个负责发送,一个负责接收服务器发来的数据,需要开两个端口不?发送方发出数据,需要接收方回应,这样的话,用异步发送,是不是就没意义了?
      

  10.   

    如果一个发送,一个接收,而且接收的还是刚刚发送的内容的回应,当然就不能开2个端口
    否则对方怎么知道应该发送给谁,一般都是你从哪个端口发送的,对方就发回这个端口.需要接收方回应,如果应答不正确,或无应答,需要重新发送?
    用异步的话,逻辑会相当复杂.用同步就简单的多.
      

  11.   

    怪我偷懒了。需要接收方回应,如果三次应答不正确,将未发送数据包移到失败消息日志中。接着发送下一条消息。
    接收的有对刚才发送内容的回应。其实,两方都需要发送内容,这个通讯程序是在客户端的,我需要发送业务程序产生的数据给服务器,并接收服务器下发的命令和软件更新。而且发送方都需要接收方做出回应。
    如果只用一个线程,采用同步的方法,需要注意些什么呢?
      

  12.   

    在服务器方也有通讯程序负责发送和接收数据。这样,就会有一种可能:在客户端通讯程序发送数据前,检测端口没有进来的数据,于是开始发送数据,而此时正好服务器发来数据。这样,我就要先响应服务器的请求。
      

  13.   

    怪我偷懒了。需要接收方回应,如果三次应答不正确,将未发送数据包移到失败消息日志中。接着发送下一条消息。
    接收的有对刚才发送内容的回应。其实,两方都需要发送内容,这个通讯程序是在客户端的,我需要发送业务程序产生的数据给服务器,并接收服务器下发的命令和软件更新。而且发送方都需要接收方做出回应。
    如果只用一个线程,采用同步的方法,需要注意些什么呢?

    如果只用一个线程,还采用同步,那你这个服务端就只能挂一个客户端,互相通信着玩了,客户端一多,必然互相打架.
    所以服务端应该是多线程的.
    当然客户端就只跟服务器通信,单线程一般足够了.
      

  14.   

    我现在只负责客户端的通讯程序,还在学习中~