delphi的tserversocket控件如何接收16进制数
Posted 张志峰的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi的tserversocket控件如何接收16进制数相关的知识,希望对你有一定的参考价值。
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; 将数据保存到这个缓冲区中。 至于你说的显示,则你要根据你的协议来确定是如何显示。 |
#2 得分:0回复于: 2013-05-28 15:03:13
Socket.ReceiveBuf() 可以读到内存里
|
|
|
#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; |
#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; |
|
#5 得分:0回复于: 2013-05-29 12:13:32
Delphi/Pascal code
这里有几个问题:接收时应该创建一个缓冲区,接收时PUSH,处理时POP。使用环形缓冲区。 不要在接收的时候同时显示到界面,除非你的用户量和接收速度都很少。 TCP连接要处理粘包的问题。 |
|||
|
#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; |
|
#7 得分:0回复于: 2013-05-29 16:55:46
还有,Socket.Connections[0]这句话中,[0]的作用是什么呢
|
|
#8 得分:0回复于: 2013-05-29 17:11:29
sendtext不符合规约要求,必须用Socket.Connections[i].SendBuf(buf,len),我再试试哈
|
#9 得分:0回复于: 2013-05-29 17:31:13
你要判断有多少个连接!如果没有连接那么 TCPServer1.Socket.Connections[0] 这个就会出现
你所说的错误! |
|
|
#10 得分:0回复于: 2013-05-30 10:29:53
发送数据帧时:TCPServer1.Socket.Connections[0].SendBUF(SDBUF,L);为什么只能从SDBUF[1]开始发送呢?如果要发送的数据是从SDBUF[0]开始的话,那我就会少发送了一个字节
|
#11 得分:0回复于: 2013-05-30 11:10:50
SDBUF 看你这个是怎么定义了! 是数组可以从0开始的
|
|
|
#12 得分:0回复于: 2013-05-31 10:42:59
谢谢,后来发现是我在定义SDBUF时,把他定义为ARRAY[1..100] OF byte了。谢谢楼上
|
以上是关于delphi的tserversocket控件如何接收16进制数的主要内容,如果未能解决你的问题,请参考以下文章
Delphi TServerSocket/ClientSocket 发送接收消息问题请教
Delphi 通信报Asynchronous socket error 10053错误的一个解决方法