近期做了一套及时通讯的系统,客户端采用idtcpclient与服务器的idtcpserver及时交互,发现如果两个客户端在一台电脑上面同时运行,会出现错误。如A、B都是客户端,但其与服务端的通讯内容不同,一旦他们在一台电脑运行,就会出现接收的信息错误。即本应发给B的信息,结果A却收到了。不知道他们是不是共用一个接收缓冲区?

解决方案 »

  1.   

    服务器端有分辨不同SOCKET来发送吧?如果服务器端做得不好,没有通过ATHREAD.HANDLE来分辨,就可能会发生你说的情况。
      

  2.   

    这肯定是A和B两个socket,你的问题还是你没处理好
      

  3.   

    LZ用阻塞模式了么?,用阻塞模式的多线程处理,不同的线程处理不同的socket客户端连接,我记得应该没问题的啊
      

  4.   

    indy肯定没有这种限制了,你再检查下代码逻辑是不是你的服务器端回应错地方了
      

  5.   

    谢谢大家的参与。服务端是采用阻塞模式的,服务端的接收是没有问题的,可以区分出是A发送的还是B发送的。问题出现在客户端,因为我采用的通讯是握手的方式,即客户端和服务器一问一答的通讯。这造成了A和B同时工作时,他们可能同时读取缓冲区(A、B的发送接收内容不一样),这时才发现他们的读取结果不正常,说明服务端是没有问题的。问题应该在客户端,测试了多种方式,还是不能正常同时工作,加上网络速度的问题,现在我采用一台电脑只允许一个客户端的工作方式,这样避免了这种错误,也便于管理。我做的通讯系统终于成功了,采用indy9的IdTCPServer和IdTCPClient组件,通讯正常,客户端功能各不相同。服务端定时检测在线情况,自动清除已断开的连接。
      

  6.   

    对于客户端,A和B的socket、Athread.handle、端口号都是不同的,如果结构体里面有这些标志,肯定不会弄混啊。通过限制本地不能多开,个人觉得不是一个好办法。
      

  7.   

    我是新来的菜鸟,正在学Socket的知识,想借鉴一下您做的那个程序,如果可以 请发到我邮箱 [email protected]  可以加我QQ 497812165 互相学习 和借鉴。