我使用  clientsocket  serversocket  两个控件  做tcp  通讯程序  
字符串发送没有问题  ,请问 如何 发送和接收16进制数据  如何将字符串转为16进制数据发送  请给个例子,谢谢了,非常急

解决方案 »

  1.   

    我也预见此问题
    后放弃控件 用SOCKET解决
      

  2.   

    字符串也是二进制啊, 在通讯中所有数据都是用二进制传送ServerSocket 和 ClientSocket 建立的是流式连接不同的是字符串可以用 #0 来结束, 二进制没有结束符, 因此可以定义个数据长度
    SendPacket = Record
      SizeOfData: Cardinal;
      Data1,
      data2.....
    end;
      

  3.   

    通信编程, 没办法, 只好给段程序看看给段 server 端的 ClientExecute 程序
        ...    while (not Terminated) and ClientSocket.Connected do
        begin
          try
            case WaitForData(FCollector.Timeout) of          wrSignaled:
              begin
                FLastActivity := Now();
                if Resolve() = csLogout then break;
                if FTerminalID = '' then break; { if the result of DoLogin is false }
              end;          wrTimeout:
              begin
                Log(SConnectionTimeout, SConnectionTimeout, '', nil, 0);
                break;
              end;          wrError:
              begin
                if not Terminated then
                  Log(SConnectionBroken, 'SERVER', nil, 0)
                else Log(SKillConnection, SKillConnection, '', nil, 0);
                break;
              end;
            end;
          except
            on e: Exception do
              Log(e.Message, 'SERVER', nil, 0);
          end;
        end;
    ...这段主要就是提用 Resolve ..., Resolve 也有个片段
    function TTCPCollectorThread.Resolve: Cardinal;
    var
      PBuffer, DataAll: PChar;
      PacketHeaderLength, DataLength, BufferLength, DataAllLength: Integer;
      ResolvedVal, ResponseVal: Variant;
      ResolveRet: Integer;
      RetSYN: Byte;
      TaskDataString: string;
      //FOR DEBUG ONLY
      //ErrorPos: string;
    begin
      PBuffer := nil;
      try
        { get packet header }
        PacketHeaderLength := Parser.GetProtocolHeaderLength(FCollector.Protocol); // 头结构长度, 这个绝对是二进制
        GetMem(PBuffer, PacketHeaderLength); // 分配内存
        ReceiveBuffer(PBuffer, PacketHeaderLength); // 从 socket 收那么长    { get data packet (together with packet header) }
        DataLength := Parser.GetDataLength(FCollector.FProtocol, PBuffer, PacketHeaderLength); // 从头结构中计算数据长度, 一般有个求和, 标记辨认, 怕不是我们定义的头
        if DataLength = -1 then // 这个就是辨认不是我们的包或包出错
        begin
          Log(SReceivedData, 'SERVER', PBuffer, PacketHeaderLength);
          raise ECollector.Create(SEInvalidDataPacket); // 就关闭这个线程
        end;    // 计算足够长的数据 + 头
        BufferLength := PacketHeaderLength + DataLength;
        ReallocMem(PBuffer, BufferLength);
        // 跳过头, 收数据
        ReceiveBuffer(@PBuffer[PacketHeaderLength], DataLength);    try
          // 解析, 下面就跟你无关了
          ResolveRet := Parser.Resolve(FCollector.FProtocol, PChar(FTerminalID),
            PBuffer, BufferLength, result, ResolvedVal, ResponseVal, RetSYN);
          ... 对上面完整数据包的计算什么的
      

  4.   

    你用TServerSocket和TClientSocket的话,可以用他的SendBuf过程来发送字节型数据,你的问题也就可以解决了。
      

  5.   

    我是新手,请问Delphi7.0中TServerSocket和TClientSocket控件在哪里?
      

  6.   

    我是新手,请问Delphi7.0中TServerSocket和TClientSocket控件在哪里?-----------------internet 控件组
      

  7.   

    在DELPHI安装目录下的SOURCE里。可以在DELPHI中利用INTSTALL PACKAGE 安装
      

  8.   

    发送:
    ///SendBufSize 每次发送的大小
    procedure TFrm_Server.SendFilePart;
    var
      sendsize: integer;
      sendbuf: array[0..SendBufSize - 1] of char;
    begin
      while LeftSize>0 do  ///leftsize:初始为stream的大小
      begin
        if LeftSize >= SendBufSize then
           sendsize := SendBufSize
        else
           sendsize := LeftSize;
        Stream.Read(sendbuf, sendsize);  ///stream:读取要发送文件的内存流
        LeftSize := LeftSize - sendsize;
        Sleep(TimeWaite); ///延时
        ServerSocket.Socket.Connections[0].SendBuf(sendbuf, sendsize);
      end;
      Stream.Clear;
      Stream.Position:=0;
    end;
      

  9.   

    接收:
      numberbytes:=Socket.ReceiveBuf(buf, Socket.ReceiveLength);  ///每次收到的长度
      Stream.Write(buf, numberbytes);                             ///stream:用来保存接收文件的内存流,接收完毕后saveasfile就行了,文件传送完毕