我的一个分布式系统的模式是:
首先有两个服务器1和服务器2,服务器1启动后跟服务器2之间建立一个长连接,假设为“长连接1”;【服务器1其实就是服务器2的一个客户端】;然后有多个应用程序在不同的机器上运行,这些应用程序是服务器1的客户端,应用程序发起报文给服务器1,服务器1通过长连接1把报文转发给服务2;现在有个问题:假设这多个应用程序同时发起报文给服务器1,那么服务器1在某个时刻就有可能同时向服务器2发起多个报文,假设为报文1和报文2;因为服务器1跟服务器2之间只有一个socket连接,那么服务器1发起的多个报文会不会导致报文混在一块啊??
就是说服务器2接收的一段报文里面【或者说是服务器2的接收缓冲区里】,有一小段是对应服务器1的发起的报文1【有可能是报文1的一小段】,然后接下来的一小段对应服务器1发起的报文2【有可能是报文2的一小段】。如果是这样的发,服务器2接收报文就会发生错乱了;到底会不会发生这种情况啊??
原来一直在写短链接的程序,现在弄长连接的,就有点糊涂了;^_^。

解决方案 »

  1.   

    tcp、udp?
    tcp能保证包的完整性和次序。
    udp也能保证包的完整性,但不保证次序,也可能会丢包
      

  2.   

    我们来举个更简单例子:服务器1和服务器2报文格式是:包长+数据;这种格式在实际情况中是经常用的;我们也不用考虑那么多个客户端程序的问题了,我们就在服务器1上模拟多个客户端,假设服务器1上两个线程同时通过这个长连接向服务器2发起报文;假设是:
    包长1+数据1;
    包长2+数据2;那么服务器2的接收缓冲区【因为服务器2的recv函数是从接收缓冲区读取数据的吧】,会不会发生错乱,比如出现:包长2+数据1+数据2+包长1,或者是包长1+数据2+包长2+数据1等等这些错误情况。当然正确的结果应当是:包长2+数据2+包长1+数据1;这样服务器读取才不会发生错误吧。我对TCPIP的底层不太清楚啊,难道TCPIP的底层会自动区分?自动形成正确的结果放在服务器的接收缓冲区里面吗??
      

  3.   

    tcp是保证次序的。楼主的正确结果不正确吧。
      

  4.   

    To ouyh12345(五岭散人) :       请问正确结果应当是怎么样子的。
           我的正确结果的意思是想让各自的包长与数据在服务器2的接收缓冲区里面是紧挨在一块的,这样我才能先接收包长域,然后根据包长域接收剩余的数据。
      

  5.   

    没问题的,放心用好了, 
    只要你发送的时候 不是 包1头+包2头+包1数据+包2数据  就可以了。
    如果你是有服务器1接受的时候 ,操作, 
    rec client1  ---> send 服务器2
    rec client2  ---> send 服务器2
    这样你可能会有问题,因为你没保证 rec client1 的时候数据是完整的业务数据结果办法
    rec client1  -->放到数据缓存,这个缓存要对应每个client , 判断业务包完整,--->  send 服务器2