各位,我想在ClientSocket连接服务端的时候就把一个附加信息给传过去,采用以下代码:
TShopInfo = Record
ShopNo: Integer; //分店号
ShopName: String; //分店名称
End; pShopInfo = ^TShopInfo;var
lshop: pShopInfo;
begin
lShop := new(pShopInfo);
lshop.ShopNo := 8888;
FClientSocket.Socket.Data := lShop;
if not FClientSocket.Active then
FClientSocket.Open
else
begin
FClientSocket.Close;
FClientSocket.Open;
end;
end;服务端在onClientconnect事件中添加以下代码:
var
i,j:integer;
lShopInfo: pShopInfo;
begin
lShopInfo := Socket.Data;//这里发现Socket.Data为nil,并没有接受到传的附加信息
end哪位知道的高手给指点一二,在此先谢过了!
TShopInfo = Record
ShopNo: Integer; //分店号
ShopName: String; //分店名称
End; pShopInfo = ^TShopInfo;var
lshop: pShopInfo;
begin
lShop := new(pShopInfo);
lshop.ShopNo := 8888;
FClientSocket.Socket.Data := lShop;
if not FClientSocket.Active then
FClientSocket.Open
else
begin
FClientSocket.Close;
FClientSocket.Open;
end;
end;服务端在onClientconnect事件中添加以下代码:
var
i,j:integer;
lShopInfo: pShopInfo;
begin
lShopInfo := Socket.Data;//这里发现Socket.Data为nil,并没有接受到传的附加信息
end哪位知道的高手给指点一二,在此先谢过了!
你可以通过第三放工具进行测试的
我最主要的目的就是在初次连接时把附加信息发送给服务端,然后服务端记录下这个客户端与附加信息的关系。如果可以这样实现,处理起来就比较方便了,不需要再专门发包给服务器传递附加信息;to:fangsp
我发数据是另外处理的,不在连接的时候发送;
這句有問題。應該用FClientSocket.Socket.SendBuf或SendText進行發送。服務端,應該在ClentRead事件中接收發送的數據;Socket.ReceiveBuf()或Socket.ReceiveText進行接收數據;
ShopNo: Integer; //分店号
ShopName: String; //分店名称 (*这个改掉比如ShopName: String[60]*)
End;
TShopInfo = Record
ShopNo: Integer; //分店号
End;
服务端收到仍然收不到DATA的数据。是不是初次连接时ClientSocket根本没把Data数据发送到服务端啊?
TShopInfo = Record
ShopNo: Integer; //分店号
ShopName: String[60]; //分店名称
End; PShopInfo = ^ TShopInfo; TNetData = record
Length: Integer;
ShopInfo: TShopInfo;
end; PNetData = ^TNetData;二、服务端拖一下TServerSocket设置Port为12345,OnClientRead写如下代码:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
NetData: PNetData;
iLen: Integer;
pBuffer: PChar;
begin
if Socket.Data = Nil then
begin
new(NetData);
Socket.Data := NetData;
NetData.Length := 0;
end
else
NetData := Socket.Data; iLen := Socket.ReceiveLength; if iLen > (sizeof(TShopInfo) - NetData.Length) then
iLen := sizeof(TShopInfo) - NetData.Length; pBuffer := @NetData.ShopInfo; Inc(pBuffer,NetData.Length); iLen := Socket.ReceiveBuf(pBuffer^, iLen); Inc(NetData.Length,iLen); if NetData.Length = sizeof(tshopInfo) then
begin
Socket.Data := Nil;
try
//DoWithShopInfoPtr(@NetData.ShopInfo);
finally
Dispose(NetData);
end;
end;
end;三、客户拖一个TClientSocket,Port设置为12345,OnConnect代码如下
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var
NetData: PNetData;
iLen,iSent: Integer;
pBuffer: PChar;
begin
New(NetData);
try
netData.ShopInfo.ShopNo := 8888;
netdata.ShopInfo.ShopName := '店名';
netData.Length := sizeof(TShopInfo); iLen := sizeof(TNetData); pBuffer := NetData; while iLen > 0 do
begin
iSent := Socket.SendBuf(pBuffer^,iLen);
Dec(iLen,iSent);
Inc(pBuffer,iSent);
end; finally
Dispose(NetData);
end;
end;