现在我用clientsocket和serversocket用来传输数据
当我传上去的数据在服务段处理正确时,服务端发一个(如'1')给客户端 ServerSocket.Socket.Connections[0].SendText(messageok);
客户端接受,在clientsocket的onread事件里去读,如readreturnmessage:=socket.ReceiveText;
客户端再根据这个指令来判断来显示不同的消息。如‘成功处理’,‘处理不成功’
当好想有时接受的指令是对的,但有时接受的有时是不对的.
当一直是‘成功处理’时,这是系统是没错,但是当‘处理不成功‘后,
再去做本应是成功处理的数据。但系统返回还是'处理不成功'但实际上数据
处理是正确的。要等下一次再在前台再传送数据给服务端后,这才显示正常
这是为何,

解决方案 »

  1.   

    楼主,你表达问题的能力真是%^$%^@%^$@#!@#$&^
      

  2.   

    和上层应用有关,TCP 协议是流传输的协议,
    在socket接口收到的有可能不是完整桢,
    特别是较大的桢或者发的特别快,需在应用层加桢头判定
    是否是完整桢,这是许多TCP初学者最常范的错误。但是
    从你的描述看好像服务器发给客户端的桢并
    不大,如果不是上述原因,那一定是应用层处理
    机制有问题,你再仔细查查
      

  3.   

    使用Delphi提供的TClientSocket以及TServerSocket时,我一般不使用他提供的OnRead以及OnWrite事件去读写Socket,因为内部的一些细节不可控(大概我对该控件还未钻研透彻),我看了一下你的描述,大致认为问题出在你虽然读了Socket里面的东西,但是没有把他读走,只是做了一个类似Peek的操作,因此会出现第二次读仍然有数据的情况。
        我一般使用这两个控件提供的方法创建/关闭联接(或者监听端口),以避免直接使用WIndows api的麻烦,然后直接使用他的Socket成员对象,利用read/write做同步的读写操作,这样做好像没什么问题发生,操作都挺正常的。(或者使用TWinsocketStream来读写)
      

  4.   

    daniel007麻烦你能说的详细点吗
      

  5.   


        问题的描述让人看的头晕,在 TCP 协议下接收数据应该使用边界定义符号来判断接收的数据为何条 Send 命令发送的数据,一般应用协议都是使用 #13#10 符号为数据流的边界定义符号。例如在 OnRead 事件中使用以下代码  nReceived := Socket.ReceiveBuf(Buffer, sizeof(Buffer));
      if nReceived > 0 then
      begin
        //判断是否接收完毕本次请求
        if (Buffer[nReceived - 2] = #13) and (Buffer[nReceived - 1] = #10) then
          Socket.Close;
      end;   一般情况下服务器的接收和发送命令要和客户端的发送和接收命令一一对应,这样就不会有问题啦,及客户端发送一条命令 Send(‘List'), 服务器端就使用 接收命令接收,接收处理完毕后在发送处理结果给客户端!这个就是一个协议的处理过程
      

  6.   

    接收文本还要这样吗, 用socket.ReceiveText不可以吗.
    服务端端处理后,发socket.sendtext('ok'),但有时好象收到的不准,
      

  7.   

    可以了,
    我用了
    while mess='' do
    begin
     socket.receivetext;
    end
    一直收,以前是由于服务端还没返回,而客户端已socket.receivetext了
    所以,
    这样解释对吗
      

  8.   

    最好少用receivetext,多用receivebuffer,自己控制读的长度这样方便多了,
      

  9.   

    楼主,我教你一个我自己学习socket时的方法首先要搞清楚这两个控件里的事件发生的顺序关系!
    比较简单的就是在所有的事件里showmessage();这样你就会弄清楚他们的关系了好久没搞了,都忘了