给你一段Server端的代码。 var s: string; begin try s := ClientSocket.Receiveln; while s <> '' do begin SocketResult := s; S := ClientSocket.Receiveln; end; if LengTh(Trim(SocketResult)) > 1 then begin //处理告警 end; finally // end;end;
1. tcpclient从tcpserver接收数据: TReceiveThread = class(TThread) private FMsg: string; protected procedure Execute; override; end;var FThread: TReceiveThread; procedure TReceiveThread.Execute; begin while not Terminated do begin if Form1.IdTCPClient1.Connected then begin FMsg := Form1.IdTCPClient1.ReadLn; Sleep(100); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin FThread := TReceiveThread.Create(False); IdTCPClient1.Host := Edit1.Text; IdTCPClient1.Port := 10001; if not IdTCPClient1.Connected then IdTCPClient1.Connect; end;2. tcpserver向tcpclient发送数据 procedure TForm1.SpeedButton1Click(Sender: TObject); var i : Integer; AThread : TIdPeerThread; begin try with IdTCPServer1.Threads.LockList do for I := 0 to Count - 1 do begin AThread := Items[I]; if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then AThread.Connection.WriteLn(s); end; finally IdTCPServer1.Threads.UnlockList; end; end;
设置 IdTCPServer1.DefaultPort := 10001; IdTCPServer1.Active := True; IdTCPClient1.Host := '服务端地址' IdTCPClient1.Port := 10001; if not IdTCPClient1.Connected then IdTCPClient1.Connect1. 客户端发送: procedure TForm1.Button1Click(Sender: TObject); begin IdTCPClient1.WriteLn('ok'); end;2. 服务端接收: procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var s: string; begin s := AThread.Connection.ReadLn; end; 3.. 客户端接收数据:(用线程;) TReceiveThread = class(TThread) private FMsg: string; protected procedure Execute; override; end;var FThread: TReceiveThread; procedure TReceiveThread.Execute; begin while not Terminated do begin if Form1.IdTCPClient1.Connected then begin FMsg := Form1.IdTCPClient1.ReadLn; Sleep(100); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin FThread := TReceiveThread.Create(False); IdTCPClient1.Host := Edit1.Text; IdTCPClient1.Port := 10001; if not IdTCPClient1.Connected then IdTCPClient1.Connect; end;2. 服务端发送数据 procedure TForm1.SpeedButton1Click(Sender: TObject); var i : Integer; AThread : TIdPeerThread; begin try with IdTCPServer1.Threads.LockList do for I := 0 to Count - 1 do begin AThread := Items[I]; if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then AThread.Connection.WriteLn(s); end; finally IdTCPServer1.Threads.UnlockList; end;
var
s: string;
begin
try
s := ClientSocket.Receiveln;
while s <> '' do
begin
SocketResult := s;
S := ClientSocket.Receiveln;
end;
if LengTh(Trim(SocketResult)) > 1 then
begin
//处理告警
end;
finally
//
end;end;
private
FMsg: string;
protected
procedure Execute; override;
end;var
FThread: TReceiveThread;
procedure TReceiveThread.Execute;
begin
while not Terminated do
begin
if Form1.IdTCPClient1.Connected then
begin
FMsg := Form1.IdTCPClient1.ReadLn;
Sleep(100);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TReceiveThread.Create(False);
IdTCPClient1.Host := Edit1.Text;
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect;
end;2. tcpserver向tcpclient发送数据
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i : Integer;
AThread : TIdPeerThread;
begin
try
with IdTCPServer1.Threads.LockList do
for I := 0 to Count - 1 do
begin
AThread := Items[I];
if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then
AThread.Connection.WriteLn(s);
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
end;
IdTCPServer1.DefaultPort := 10001;
IdTCPServer1.Active := True; IdTCPClient1.Host := '服务端地址'
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect1. 客户端发送:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.WriteLn('ok');
end;2. 服务端接收:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
s: string;
begin
s := AThread.Connection.ReadLn;
end;
3.. 客户端接收数据:(用线程;) TReceiveThread = class(TThread)
private
FMsg: string;
protected
procedure Execute; override;
end;var
FThread: TReceiveThread;
procedure TReceiveThread.Execute;
begin
while not Terminated do
begin
if Form1.IdTCPClient1.Connected then
begin
FMsg := Form1.IdTCPClient1.ReadLn;
Sleep(100);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TReceiveThread.Create(False);
IdTCPClient1.Host := Edit1.Text;
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect;
end;2. 服务端发送数据
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i : Integer;
AThread : TIdPeerThread;
begin
try
with IdTCPServer1.Threads.LockList do
for I := 0 to Count - 1 do
begin
AThread := Items[I];
if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then
AThread.Connection.WriteLn(s);
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
2.非阻塞模式建议用D6中的CLIENTSOCKET SERVERSOCKET,D7中可以通过 COMPONENT->
INSTALL PACKAGES->add->DELPH7\BIN\DCLSOCKETS70.BPL来添加。
3。TCPCLIENT,TCPSERVER在D7中的DEMOS是用的阻塞模式,当客户端连接后建立了线程来处理和客户端的通讯问题。BLOCKMODE:=BMTHREADBLOCKING;
4。TCPCLIENT,TCPSERVER也可以工作在非阻塞模式,BLOCKMODE:=BMNOBLOCKING;这样就象CLIENTSOCKET SERVERSOCKET了,但是TCPCLIENT 可以象CLIENTSOCKET一样又ONREAD,ONWRITE,而TCPSERVER确没有看到象SERVERSOCKET那样的ONCLIENTREAD,ONCLIENTREAD.
5.查看TCPSERVER的源代码,发现他和TCPCLIENT一样最终是继承于TBaseSocket的,那么应该也可以有ONREAD,ONWRITE。
6。如果我们象TCPCLIENT那样作个procedure TcpServerReceive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer),你面写处理代码,然后TCPSERVER1.OnReceive:=TcpServerReceive; OnSend也如此类推,应该就可以了。
7。这个方法没有测试,但原理是这样的,只不过TCPSERVER的OnReceive,OnSend在设计时看不到而已,不等于他没有。
var
Form1: TForm1;
m:TMemorystream;
Buf:array[0..10000] of byte;
implementation{$R *.dfm}procedure TForm1.WMNCHitTest(var Msg: TMessage);
begin
inherited; // 这样,移动就不可能了...
//edit1.Text:=inttostr(msg.Result);
{if (msg.Result=2)or(msg.Result=3) then msg.Result:=1
else
if (msg.Result=1) then msg.Result:=2;}
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(edit2.Text);
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add('客户端说:'+socket.ReceiveText);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
ServerSocket1.Socket.Connections[0].SendText(edit1.Text);
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var len:integer;JPG:TJpegimage;B:TBitmap;
begin
memo1.Lines.Add('服务端说:'+socket.ReceiveText);
Len:=socket.ReceiveLength;//读出包的长度
socket.ReceiveBuf(Buf,len);//读包并存入Buf
m.Write(Buf,Len);//追加到 m流
JPG.LoadFromStream(m);
B.Assign(JPG);
Image1.Picture.Bitmap.Assign(B);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
ClientSocket1.Open;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
ClientSocket1.Close;
end;procedure TForm1.Button3Click(Sender: TObject);
var B:TBitmap;JPG:TJpegimage;
desk:TCanvas;
begin
B:=TBitmap.Create;
desk:=TCanvas.Create;
JPG:=TJpegimage.Create;
desk.Handle:=GetDC(hwnd_desktop);
B.Width:=screen.Width;B.Height:=Screen.Height;
B.Canvas.CopyRect(b.Canvas.ClipRect,desk,desk.ClipRect);
B.SaveToFile('scr.bmp');
JPG.Assign(B);
JPG.SaveToFile('SCR.jpg');
JPG.SaveToStream(m);
m.Position:=0;
ClientSocket1.Socket.SendStream(m);
B.Free;
JPG.Free;
end;end.
乱说,表误导人了~
D7的Tcp控件需要自己控制,当然它们都写了基础方法,可以直接调用,取消使用了消息机制,我想这可能是以后的趋势
tcpclient好使用,已经给出了select方法,可随意使用,onreceive是需要自己触发的!TBaseSocket只是建立了基础socket而已,并没WSA消息
tcpserver要自己新继承线程控制,在getthread里~