以下是我以前做的一个项目的代码,你可能要稍微改一下.
1.初始化WINSOCK:
procedure TZxQkForm.FormCreate(Sender: TObject);
var
mWSADATA: TWSADATA;
mAddr: TSockaddr;
ip,Ls: string;
begin
WSAStartUp($202,mWSADATA);
mSocket:=Socket(AF_INET,SOCK_STREAM,0);
if mSocket<>INVALID_SOCKET then
begin
ip:='192.168.0.1';
if Trim(Dm.XtSzQuery.FieldByName('YCIP').AsString)<>'' then
ip:=Dm.XtSzQuery.FieldByName('YCIP').AsString;
mAddr.sin_family:=AF_INET;
mAddr.sin_addr.S_addr:=inet_addr(PChar(ip));
mAddr.sin_port:=htons(8888);
if Connect(mSocket,mAddr,SizeOf(TSockAddr))=0 then
begin
Ls:=#14+Dm.XtSzQuery.FieldByName('DWDH').AsString;
if Send(mSocket,Pointer(Ls)^,Length(Ls),0)<>SOCKET_ERROR then
begin
WSAAsyncSelect(mSocket,Handle,WM_SOCKEVENT,FD_READ);
Dm.SocketConnection1.Address:=ip;
end;
end
else
MessageBox(Handle,'未能连接工程部服务器,请与工程部联系!','提示',MB_OK+MB_ICONERROR);
end;
2.接收应用服务器发来的信息:
procedure TZxQkForm.WmSockEvent(var Msg: TMessage);
var
theLength: integer;
mBuff: array[0..4095] of Char;
s: string;
begin
if Lo(Msg.LParam)=FD_READ then
begin
theLength:=Recv(Msg.WParam,mBuff,4096,0);
if thelength>0 then
begin
case mBuff[0] of
#14: begin
SpeedButton1.Enabled:=True;
SpeedButton1.Caption:='工程部在线';
end;
#15: begin
SpeedButton1.Enabled:=False;
SpeedButton1.Caption:='工程部离线';
end;
#16: begin
s:=Copy(mBuff,4,theLength-3);
Memo1.Lines.Add('工程部说:'+s);
//PlaySound('Sound1', Hinstance, SND_RESOURCE);
end;
end;
end;
end;
end;
3.提交远程数据库线程:
procedure RmPostThread.Execute;
var
Ls: string;
begin
self.FreeOnTerminate:=True;
while not self.Terminated do
begin
WaitForSingleObject(EventHandle,INFINITE); //等待本地用户增加记录,无等待超时.
Ls:=#20+TableName; //#20代表是测试数据,如果通过,则服务器解释客户将要更新的是什么表。
if Send(mSocket,Pointer(Ls)^,Length(Ls),0)<>SOCKET_ERROR then //说明远程服务器连接无故障。
begin
//这里写要提交远程数据库的代码.
end;
ResetEvent(EventHandle); //提交全部成功后设置无信号,并继续等待信号。
end;
CloseHandle(EventHandle);
DeleteObject(EventHandle);
end;
下面是应用服务器端的WINSOCK事件代码:
procedure TMainForm.WmSockEvent(var msg: TMessage);
var
i,j: integer;
s: string;
Ps: PChar;
mBuff: array[0..4095] of char;
theLength: DWORD;
ClientSocket: TSocket;
ClientAddr: TSockAddr;
begin
case Lo(msg.LParam) of
FD_CONNECT: begin
end;
FD_ACCEPT: begin
theLength:=SizeOf(TSockAddr);
ClientSocket:=Accept(ServerSocket,@ClientAddr,@theLength);
if ClientSocket<>INVALID_SOCKET then
WSAAsyncSelect(ClientSocket,Handle,WM_SOCKEVENT,FD_READ or FD_CLOSE);
end;
FD_READ: begin
theLength:=Recv(msg.WParam,mBuff,4096,0);
if theLength>0 then
begin
case mBuff[0] of
#14: begin //发过来的是客户登陆信息(单位编号)。
//do SomeThing;
end;
#16: begin //发过来的是普通数据。
//do SomeThing;
end;
#20: begin //发过来的是测试是否连接,并表明是更新的什么表。
//do SomeThing;
end;
#21: begin //发过来的是测试是否连接,并表明是数据同步。
//do SomeThing;
end;
end;
end;
end;
FD_CLOSE: begin
//do SomeThing;
end;
end;
end;