socket 控件 使用问题 非常着急 我使用 clientsocket serversocket 两个控件 做tcp 通讯程序 字符串发送没有问题 ,请问 如何 发送和接收16进制数据 如何将字符串转为16进制数据发送 请给个例子,谢谢了,非常急 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也预见此问题后放弃控件 用SOCKET解决 字符串也是二进制啊, 在通讯中所有数据都是用二进制传送ServerSocket 和 ClientSocket 建立的是流式连接不同的是字符串可以用 #0 来结束, 二进制没有结束符, 因此可以定义个数据长度SendPacket = Record SizeOfData: Cardinal; Data1, data2.....end; 通信编程, 没办法, 只好给段程序看看给段 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); ... 对上面完整数据包的计算什么的 你用TServerSocket和TClientSocket的话,可以用他的SendBuf过程来发送字节型数据,你的问题也就可以解决了。 我是新手,请问Delphi7.0中TServerSocket和TClientSocket控件在哪里? 我是新手,请问Delphi7.0中TServerSocket和TClientSocket控件在哪里?-----------------internet 控件组 在DELPHI安装目录下的SOURCE里。可以在DELPHI中利用INTSTALL PACKAGE 安装 发送:///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; 接收: numberbytes:=Socket.ReceiveBuf(buf, Socket.ReceiveLength); ///每次收到的长度 Stream.Write(buf, numberbytes); ///stream:用来保存接收文件的内存流,接收完毕后saveasfile就行了,文件传送完毕 来一个大家都会的。。。 一个关于数据库控件BDE的问题,请高手帮忙??? 关于ICO文件格式 有关USB驱动程序的开发给点意见好吗? 怎样得到一个键的 Virtual key codes ListView的问题 使用dxComponentPrinter打印dxDBGrid的内容时,生成程序后在另一机子上运行的报表怎幺是空白的? 使用socket的问题 关于treeview:这段程序该怎么写? 进来的话对你一定有帮助,也一定有分加--一个关于指针的话题 ADOQuery 如何 loadXMLfromStream 在服务程序里连接数据库的问题
后放弃控件 用SOCKET解决
SendPacket = Record
SizeOfData: Cardinal;
Data1,
data2.....
end;
... 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);
... 对上面完整数据包的计算什么的
///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;
numberbytes:=Socket.ReceiveBuf(buf, Socket.ReceiveLength); ///每次收到的长度
Stream.Write(buf, numberbytes); ///stream:用来保存接收文件的内存流,接收完毕后saveasfile就行了,文件传送完毕