对方客户端发送数据如:68 00 00··········;接收完成后,数据长度没错(13),但是显示接收结果时,只显示一个字母h(68的字符表示),后面一连串的都显示不出来了(00没有对应字符,问题应该是在这)。请问一下,我要怎么样才能完整把我接收到的数据显示出来呢Delphiserversocket16进制

解决方案 »

  1.   

    用户发来的应该不是字符串。
    所有数据都可以看成是在内存中按字节保存的。 68 00 00 1A 2C 。至于表示的是一个结构体,数字,字符这是你协议决定的。接收时先创建一个数组缓冲区  buf:Array [0..1023] of Byte; 将数据保存到这个缓冲区中。
    至于你说的显示,则你要根据你的协议来确定是如何显示。
      

  2.   

    Socket.ReceiveBuf() 可以读到内存里
      

  3.   

    保存到缓冲区可以做到。但是怎么我取出缓冲区里面的内容都是空的呢,程序如下,请帮忙看看错在哪里
    procedure TMAINFORM.TCPServer1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      iLength,I: Integer;
      iReceived: Integer;
      buff: array of byte;
      S:STRING;
    begin
       S:='';
       iLength:= Socket.ReceiveLength;
        MEMO1.Lines.Add(INTTOSTR(ILENGTH));
       while iLength>0 do
       begin
        SetLength(buff, iLength);
        iReceived := Socket.ReceiveBuf(buff[0], iLength);
        iLength := iLength - iReceived;
       end;
       FOR I:=0 TO iLength-1 DO
         BEGIN
           S:=S+INTTOSTR(BUFF[I]);
         END;
       MEMO1.Lines.Add(S);
       buff:= nil;
    end;
      

  4.   

    procedure TMAINFORM.TCPServer1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      iLength,I,iStart, iRevCount: Integer;
      iReceived: Integer;
      buff: array of byte;
      S:STRING;
    begin
       S:='';
       iStart := 0;
       iLength:= Socket.ReceiveLength;
       iRevCount := iLength; //这里加入的
        SetLength(buff, iLength);
        MEMO1.Lines.Add(INTTOSTR(ILENGTH));
       while iLength>0 do
       begin
         iReceived := Socket.ReceiveBuf(buff[iStart], iLength); //这里修改了注意
          iStart := iStart + iReceived ; //这里加入的
         iLength := iLength - iStart;
       end;
       //下面你的iLength 使用 iRevCount 替换了
       FOR I:=0 TO iRevCount -1 DO
         BEGIN
           S:=S+INTTOSTR(BUFF[I]);
         END;
       MEMO1.Lines.Add(S);
       buff:= nil;
    end;
      

  5.   

    function receSocket(socket:TCustomWinSocket)
    var
      i,L:Integer;
      buff:Array of Byte;
    begin
      L:= Socket.ReceiveLength;
      if L<=0 then
        exit;
      SetLength(buff, L);
      i:= Socket.ReceiveBuf(buff[0], L);
      if i<L then
        receSocket(Socket);
    end;这里有几个问题:接收时应该创建一个缓冲区,接收时PUSH,处理时POP。使用环形缓冲区。
    不要在接收的时候同时显示到界面,除非你的用户量和接收速度都很少。
    TCP连接要处理粘包的问题。
      

  6.   

    接收问题4楼帮我解决了,谢谢四楼。现在又有个问题,为什么我发送数据时出现错误:list index out of bounds(0)?发送过程为:procedure TMAINFORM.Button3Click(Sender: TObject);
     var
         s1:string;
    begin
       s1:=Memo2.seltext;
       s1:=StringReplace(s1,' ','',[rfReplaceAll]);
       TCPServer1.Socket.Connections[0].SendText(S1);
    end;
      

  7.   

    还有,Socket.Connections[0]这句话中,[0]的作用是什么呢
      

  8.   

    sendtext不符合规约要求,必须用Socket.Connections[i].SendBuf(buf,len),我再试试哈
      

  9.   

        你要判断有多少个连接!如果没有连接那么 TCPServer1.Socket.Connections[0] 这个就会出现你所说的错误!
      

  10.   

    发送数据帧时:TCPServer1.Socket.Connections[0].SendBUF(SDBUF,L);为什么只能从SDBUF[1]开始发送呢?如果要发送的数据是从SDBUF[0]开始的话,那我就会少发送了一个字节
      

  11.   

    SDBUF 看你这个是怎么定义了! 是数组可以从0开始的
      

  12.   

    谢谢,后来发现是我在定义SDBUF时,把他定义为ARRAY[1..100] OF byte了。谢谢楼上