TSendTxt=packed Record
Size:integer;
text:array [0..127] of char;
Param:integer;
Value:integer;
end;procedure TfrmTtsServer.sckServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
SendTxt:TSendTxt;
Buffer:array [0..102400]of char;
i,PacketLen,Receivelen :integer;
begin
//Socket.SocketHandle
tmWait.Enabled :=true;
PacketLen := SizeOf(TSendTxt);
ReceiveLen := Socket.ReceiveLength;
if (ReceiveLen mod PacketLen) <> 0 then
Exit;
Socket.ReceiveBuf(Buffer, ReceiveLen);
for i := 0 to ReceiveLen div SizeOf(TSendTxt) - 1 do
begin
Move(Buffer, SendTxt, PacketLen);
memo1.Lines.Add('rec '+inttostr(Socket.SocketHandle));
ReceiveData(sendTxt,socket.SocketHandle);
//socket.SendBuf(sendtxt,sizeof(TsendTxt));
Move(Buffer[PacketLen], Buffer, ReceiveLen - (i + 1) * PacketLen);
end;
end;//发
function TForm1.SendTxt(ChannelNo:integer; sSendText: string):boolean;
var
len:integer;
SendTxt:TSendTxt;
isize:integer;
buf:string;
iId:integer;
begin
Len := length(sSendText);
FillChar(SendTxt,sizeof(TsendTxt),0);
SendTxt.Value := tbSpeed.Position;
if len=0 then
begin
Result:=false;
exit;
end;
repeat
if len>128 then
begin
{mbSingleByte 单字母
mbLeadByte 双字节第一位
mbTrailByte 双字节第二位
}
if ByteType(sSendText,128)=mbLeadByte then//末尾是否为半个汉字
begin
iSize:=127;
Buf:=copy(sSendText,1,127);
sSendText:=copy(sSendText,128,Len-127);
Len := Len-127;
end
else
begin
iSize:=128;
Buf:=copy(sSendText,1,128);
sSendText:=Copy(sSendText,129,len-128);
len:=len-128;
end;
end
else
begin
iSize:=len;
buf:=sSendText;
sSendText:='';
len:=0;
end;
//send
sendtxt.Size := iSize;
strpcopy(SendTxt.text,buf);
iId:=VocStatu[ChannelNO].ComponentId; if Components[iId] is TClientSocket then
(Components[iId] as TClientSocket).Socket.SendBuf(Sendtxt,sizeof(TSendTxt))
else
caption:=Components[iId].Name; until len<=0end;
Size:integer;
text:array [0..127] of char;
Param:integer;
Value:integer;
end;procedure TfrmTtsServer.sckServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
SendTxt:TSendTxt;
Buffer:array [0..102400]of char;
i,PacketLen,Receivelen :integer;
begin
//Socket.SocketHandle
tmWait.Enabled :=true;
PacketLen := SizeOf(TSendTxt);
ReceiveLen := Socket.ReceiveLength;
if (ReceiveLen mod PacketLen) <> 0 then
Exit;
Socket.ReceiveBuf(Buffer, ReceiveLen);
for i := 0 to ReceiveLen div SizeOf(TSendTxt) - 1 do
begin
Move(Buffer, SendTxt, PacketLen);
memo1.Lines.Add('rec '+inttostr(Socket.SocketHandle));
ReceiveData(sendTxt,socket.SocketHandle);
//socket.SendBuf(sendtxt,sizeof(TsendTxt));
Move(Buffer[PacketLen], Buffer, ReceiveLen - (i + 1) * PacketLen);
end;
end;//发
function TForm1.SendTxt(ChannelNo:integer; sSendText: string):boolean;
var
len:integer;
SendTxt:TSendTxt;
isize:integer;
buf:string;
iId:integer;
begin
Len := length(sSendText);
FillChar(SendTxt,sizeof(TsendTxt),0);
SendTxt.Value := tbSpeed.Position;
if len=0 then
begin
Result:=false;
exit;
end;
repeat
if len>128 then
begin
{mbSingleByte 单字母
mbLeadByte 双字节第一位
mbTrailByte 双字节第二位
}
if ByteType(sSendText,128)=mbLeadByte then//末尾是否为半个汉字
begin
iSize:=127;
Buf:=copy(sSendText,1,127);
sSendText:=copy(sSendText,128,Len-127);
Len := Len-127;
end
else
begin
iSize:=128;
Buf:=copy(sSendText,1,128);
sSendText:=Copy(sSendText,129,len-128);
len:=len-128;
end;
end
else
begin
iSize:=len;
buf:=sSendText;
sSendText:='';
len:=0;
end;
//send
sendtxt.Size := iSize;
strpcopy(SendTxt.text,buf);
iId:=VocStatu[ChannelNO].ComponentId; if Components[iId] is TClientSocket then
(Components[iId] as TClientSocket).Socket.SendBuf(Sendtxt,sizeof(TSendTxt))
else
caption:=Components[iId].Name; until len<=0end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货