对方客户端发送数据如:68 00 00··········;接收完成后,数据长度没错(13),但是显示接收结果时,只显示一个字母h(68的字符表示),后面一连串的都显示不出来了(00没有对应字符,问题应该是在这)。请问一下,我要怎么样才能完整把我接收到的数据显示出来呢Delphiserversocket16进制
解决方案 »
- VC++生成的动态链接库,Delphi可以直接调用吗
- WebBrowser控件,如何不让Webbrowser下载网页中的图像或Flash或背景音乐之类的东西?
- 如何象acdsee那样动态的实现某个文件夹中图片的预览?
- 把cxGrid里面的一个字段的Properties属性设为ComboBox,如何在代码里动态往这个ComboBox里填加值
- 请专家判别这是什么控件?
- 50分求SQLSERVER库主表与子表的建立关联。
- 如何用bitblt函数使BMP、ICON透明化?
- 有没有谁写过b/s结构的程序
- 求定时器示例
- delphi5的sql explorer 登陆进IBlocal后,点Tables后,出现错误:
- 关于系统模块化开发的二个疑问
- GLScene中如何给FreeForm的3DS文件添加它自带的贴图?
所有数据都可以看成是在内存中按字节保存的。 68 00 00 1A 2C 。至于表示的是一个结构体,数字,字符这是你协议决定的。接收时先创建一个数组缓冲区 buf:Array [0..1023] of Byte; 将数据保存到这个缓冲区中。
至于你说的显示,则你要根据你的协议来确定是如何显示。
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;
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;
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连接要处理粘包的问题。
var
s1:string;
begin
s1:=Memo2.seltext;
s1:=StringReplace(s1,' ','',[rfReplaceAll]);
TCPServer1.Socket.Connections[0].SendText(S1);
end;