http://bbs.csdn.net/topics/390473005

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

更多0

用户发来的应该不是字符串。
所有数据都可以看成是在内存中按字节保存的。 68 00 00 1A 2C 。

至于表示的是一个结构体,数字,字符这是你协议决定的。

接收时先创建一个数组缓冲区  buf:Array [0..1023] of Byte; 将数据保存到这个缓冲区中。
至于你说的显示,则你要根据你的协议来确定是如何显示。

关注
yjianxi
Bolo_Yang
本版等级:

 
#2 得分:0回复于: 2013-05-28 15:03:13
Socket.ReceiveBuf() 可以读到内存里
关注
zhengjiujie
zhengjiujie
本版等级:

 
#3 得分:0回复于: 2013-05-28 16:08:47
保存到缓冲区可以做到。但是怎么我取出缓冲区里面的内容都是空的呢,程序如下,请帮忙看看错在哪里
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;

关注
xhz8000
xhz8000
本版等级:

 
#4 得分:40回复于: 2013-05-28 16:34:13
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;

关注
ZyxIp
ZyxIp
本版等级:

 
#5 得分:0回复于: 2013-05-29 12:13:32
Delphi/Pascal code

 

?

1
2
3
4
5
6
7
8
9
10
11
12
13
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连接要处理粘包的问题。

关注
zhengjiujie
zhengjiujie
本版等级:

 
#6 得分:0回复于: 2013-05-29 16:52:38
接收问题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;

关注
zhengjiujie
zhengjiujie
本版等级:

 
#7 得分:0回复于: 2013-05-29 16:55:46
还有,Socket.Connections[0]这句话中,[0]的作用是什么呢
关注
zhengjiujie
zhengjiujie
本版等级:

 
#8 得分:0回复于: 2013-05-29 17:11:29
sendtext不符合规约要求,必须用Socket.Connections[i].SendBuf(buf,len),我再试试哈
关注
xhz8000
xhz8000
本版等级:

 
#9 得分:0回复于: 2013-05-29 17:31:13
    你要判断有多少个连接!如果没有连接那么 TCPServer1.Socket.Connections[0] 这个就会出现

你所说的错误!

关注
zhengjiujie
zhengjiujie
本版等级:

 
#10 得分:0回复于: 2013-05-30 10:29:53
发送数据帧时:TCPServer1.Socket.Connections[0].SendBUF(SDBUF,L);为什么只能从SDBUF[1]开始发送呢?如果要发送的数据是从SDBUF[0]开始的话,那我就会少发送了一个字节
关注
xhz8000
xhz8000
本版等级:

 
#11 得分:0回复于: 2013-05-30 11:10:50
SDBUF 看你这个是怎么定义了! 是数组可以从0开始的
关注
zhengjiujie
zhengjiujie
本版等级:

 
#12 得分:0回复于: 2013-05-31 10:42:59
谢谢,后来发现是我在定义SDBUF时,把他定义为ARRAY[1..100] OF byte了。谢谢楼上

delphi的tserversocket控件如何接收16进制数的更多相关文章

  1. 实战项目开发细节:C语言分离一个16进制数取出相应的位1或0

    最近在公司开发一个关于钢琴的PCBA项目,项目大概是这样的,完成各种功能的测试,准备去工厂量产的时候可以通过软件快速甄别硬件是否短路,断路等问题. 其中,甄别好坏的方法是通过比如按键,或者其它的操作然 ...

  2. php 将16进制数串转换为二进制数据的函数

    /**     * 将16进制数串转换为二进制数据的函数     * @param $hexdata     * @return string bindata     */     function ...

  3. 汇编:1位16进制数到ASCII码转换

    ;============================ ;1位16进制数到ASCII码转换 ; { X+30H (0≤X≤9) ;Y= { ; { X+37H (0AH≤X≤0FH) DATAS ...

  4. Java中8进制数和16进制数的表示方法

    由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题.  但,二进制数太长了.比如int   类型占用4个字节,32位.比如100,用int类型的二进制数表达将 ...

  5. C#一个16进制数用二进制数表示是几位?

    1个字节是8位,二进制8位:xxxxxxxx 范围从00000000-11111111,表示0到255.一位16进制数(用二进制表示是xxxx) 最多只表示到15(即对应16进制的F),要表示到255 ...

  6. android 蓝牙编程重点---如何发送和接收16进制数据

    最近的android蓝牙开发项目也逐渐接近尾声,基本的功能都已经完成,只剩下界面的设计.现在真的是舒了一口气! 作为编程学习经验只有1年的菜鸟,这是我独自完成的商业性产品,而且还是涉及到与单片机蓝牙模 ...

  7. MFC 编辑框输入16进制字符串转换为16进制数或者10进制数据计算

    1.编辑框添加变量,并选择变量类型为CString. 2.  使用“_tcstoul”函数将Cstring 类型转换为16进制/10进制数进行计算.

  8. 怎么用Python Flask模板jinja2在网页上打印显示16进制数?

    问题:Python列表(或者字典等)数据本身是10进制,现在需要以16进制输出显示在网页上 解决: Python Flask框架中 模板jinja2的If 表达式和过滤器 假设我有一个字典index, ...

  9. python 整数转16进制数

    def toHex(num): """ :type num: int :rtype: str """ chaDic = {: : : : : ...

随机推荐

  1. Python命令行中输入pip提示不是内部或外部命令

    WIN764位,Python34 输入命令python -m pip

  2. 【转】windows7的桌面右键菜单的“新建”子菜单,在注册表哪个位置,如何在“新建"里面添加一个新项

    点击桌面,就会弹出菜单,然后在“新建”中就又弹出可以新建的子菜单栏.office与txt 的新建都是在这里面的.我想做的事情是:在右键菜单的“新建” 中添加一个“TQ文本”的新建项,然后点击它之后,桌 ...

  3. Tengine:基于Nginx的衍生版

    engine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验 ...

  4. VMware虚拟系统 bridged、NAT、host-only三种网络连接模式

    目录 前言 bridged(桥接模式) NAT(网络地址转换模式) host-only(仅主机模式) 总结 前言 如果你想利用VMWare安装虚拟机,或想创建一个与网内其他机器相隔离的虚拟系统,进行特 ...

  5. 清理java环境

    system32中存在3个java*.exe文件,分别是: c:/windows/system32/java.exe c:/windows/system32/javaw.exe c:/windows/ ...

  6. UI设计的重要性--避免二义性的输入提示

    昨天晚上发现了西安公路客运网上售票系统网站的密码找回系统存在安全漏洞,得出的结论是:密码找回页的漏洞:   1.用户名栏支持用户名.身份证.电话三种任意一种匹配.2.这一步是关键,密码找回问题提示栏居 ...

  7. (转)WEB第三方打印控件[ASP.NET常用工具]

    本文转载自:http://blog.csdn.net/chz_cslg/article/details/25415347 在B/S模式开发中,打印是个很大的困扰.无论是采用页面直接输出或者引用WORD ...

  8. Python的更多内容

    到目前为止,我们已经学习了绝大多数常用的Python知识.在这一章中,我们将要学习另外一些方面的Python知识,从而使我们对Python的了解更加 完整 . 1.特殊的方法 在类中有一些特殊的方法具 ...

  9. .net下MD5算法和加盐

    MD5方法: public static string GetMD5(string sDataIn)        {            MD5CryptoServiceProvider md5 ...

  10. android学习笔记19——对话框(DatePickerDialog、TimePickerDialog)

    DatePickerDialog.TimePickerDialog ==> DatePickerDialog.TimePickerDialog功能.用法都比较简单,操作步骤: 1.通过new关键 ...