PC端设置为服务器,串转网为客户端,现在当PC端的服务器程序启动后,开启串转网设备,服务器程序能够检测到串转网已经和服务器程序建立连接,可是串转网设备发送数据过来时,服务器程序却没有接受到数据(我的服务器程序能和用idtcpclient编写的客户端程序通信正常),请问可能是什么原因。

解决方案 »

  1.   

    是不是用Idtcpserver做服务器端,客户端发送数据只能用Idtcpclient,否则怎么不能接收从串转网设备发送的数据呢,另外我用telnet 192.168.0.11 1001(服务器端的IP和端口号)是能够给服务器发送数据,而且服务器端也能够正常显示。
      

  2.   

    我现在服务器端用idtcpserver,客户端为moxa(一种串转网设备,数据传输协议是tcp协议),现在的问题时客户端和服务器端能连接上,但发送数据到服务器端时,在IdTCPServerExecute事件,当我使用ReadLn(),发现读不到数据;当使用CurrentReadBuffer,发现接收的数据不完整;当使用ReadLn('特殊字符',5,-1)发现有时候读出的数据又有多余的(上次和这次的一起过来),另外我的服务器端程序用我自己编写的客户端程序(使用idtcpclient),在客户端用readln接收正常.
      

  3.   

    客户端发送数据的时候,在数据结尾加上两个字符#13#10,服务器用AContext.Connection.IOHandler.ReadLn接收,我也做GPRS数据通讯的服务端,就是这么接收的,收发很正常
      

  4.   

    现在是客户端加#13#10不太可能,而且我们的原始数据传输途径是超短波(很可能最后的两个字符(#13#10)收不到),接收机收到后给串转网设备,然后通过网络给服务器。“服务器用AContext.Connection.IOHandler.ReadLn”你用的是indy10的IdTcpServer吧。
      

  5.   


    Readln函数是以#13或#10或者#13#10作为结束符的,如果在通讯协议中没有定义这样的结束符,则最好不要用Readln函数。
      

  6.   

    我现在的客户端是一个串转网设备(该设备从带串口的设备收到数据,通过网口发送到服务器端)我在服务器端要如何接收才能实时地把数据接收完整?我用FillChar(sCommand,sizeof(sCommand),#0);也用过CurrentReadBuffer;也用过readln,可结果都不理想。
      

  7.   

    to jadeluo 
    我用fillchar定义接收指定的包,可串转网设备接收到的数据长度不是固定的,如果用fillchar接收到的数据会出现第N包数据的某些字符+ 第(N-1)包数据的某些字符。
    如果我想把每次传输的数据接收完整还需要在哪些方面做处理。
      

  8.   

    我想请教jadeluo:我在IdTCPServerExecute中如何才能把客户端(串转网设备)的数据(比如说52个字节或者60个字节)在服务器端一次收齐。
      

  9.   

    如果知道要等待接收的数据字节数, 则可以使用ReadBuffer函数来等待并读取。procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
      AData : array [0..49] of Byte;
    begin
      AThread.Connection.ReadTimeout := 5000;  //设置超时时间
      AThread.Connection.ReadBuffer(AData, Sizeof(AData));
    end;
      

  10.   

    jadeluo 可能误会我的意思了,我接收的数据不是定长的,有时候可能是52个,有时候可能是60个
    我有点纳闷了,为什么我用pc机模拟客户端发送数据,服务器端接收得很好,想发几个数据,服务器端就能接收几个数据,是用CurrentReadBuffer接收。
    而一用上串转网设备后,接收数据就惨不忍睹了。
      

  11.   

    moxa的东西似乎有专用协议,不支持直连。
    用下面代码试试。
     RecvCount:=self.FThread_STN.Connection.IOHandler.InputBuffer.Size;
        if RecvCount>0 then
           begin
             with self.FThread_STN.Connection.IOHandler.InputBuffer do
              begin
                    RecvCount:=size;
                    //读TCP/IP数据到缓冲
                     ExtractToBytes(RecvBuffer_NTS,Size,false);
                   end;
           end;