请教如何取局域网内指定的一台电脑的系统时间?

simanh 2003-04-06 09:37:58
我想取得LAN内的另一台电脑的系统时间,请问怎么才能办到呢?谢谢
...全文
28 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼主要想写一个只有服务器和客户机传信息的软件这很简单,如果要写一个多客户端的程序那得在服务器上的软件中写代码,根据具体的要求来写代码。
参考资料:
http://www.yesky.com/20010323/166519.shtml
http://expert.csdn.net/expert/faq/faq_index.asp?id=2877
http://www.21bbs.org/cgi-bin/topic.cgi?forum=119&topic=36&show=0
http://www.swm.com.cn/yingyong/yy-00-08/yy12.htm
http://sanjianxia.myrice.com/delphi/31.htm
http://raptorz.myetang.com/mentals/share/dev/msocket.htm
http://www.xinyuxx.myetang.com/cxrs/wljk.htm
http://www.361000.com.cn/edu/media/delphi/de009.htm
http://www.wuxibook.com/other/bookdetail.asp?id=66
http://www.mangosoft.net/cgi-bin/mangosoft/printpage.cgi?forum=1&topic=27
http://www.delphibyte.com/article/category.php?Category=20&pageno=2
http://www.moreres.com/doc/read.php?id=4291
http://www.mynetlife.com/tech/list.asp?id=11
http://www.youthfly.com/cgi-bin/forum/topic.cgi?forum=8&topic=87&show=0

提供以上资料希望对楼主有所帮助:)

祝:身体健康:)~!!
  • 打赏
  • 举报
回复
如果要是写代码的话,不亚于写一个局域网聊天的软件了,所以在这只能给一些参考类资料的代码,如果想实现楼主想要的功能,那需要在局域网中每台客户机都要安装客户端软件,并且还要在运行中。

Delphi编程TClientSocket和TServerSocket的使用
文远在线 2002-11-1 WWW.WENYUAN.CN.GS


Delphi的TClientSocket和TServerSocket使用比较简单,与VB中的Winsock ActiveX控件类似。在窗体上添加TClientSocket控件后,可以设置其各项属性。

  Active: Boolean。若设置为True,则程序运行后,在控件的创建中,TClientSocket自动调用SetActive从而使控件自动创建Socket,然后连接指定的服务端IP和端口。若设置为False,则你可以在需要的时候才把它设置为True,建立连接。注意在连接建立后(Active为True),则不能改变控件的IP和端口属性。
  Address: string。设置要连接的服务端的IP,格式是'xxx.xxx.xxx.xxx',其中xxx为0到255之间的整数。改变Address的值将会把Host属性设为空字符串,反之亦然。
  ClientType: (ctNonBlocking, ctBlocking)。默认为ctNonBlocking,此时控件会使用WSAAsyncSelect设置异步模式,所有通讯操作均在VCL主线程的消息循环内完成。设置ctBlocking类型,则不会设置异步模式,通讯操作会导致程序停顿,除非你把它放到单独的线程里面,在这种模式下,你应该使用TWinSocketStream对象控制读写操作,该对象可以防止因读写操作错误而造成的死循环。不过我从来都只用过异步模式,感觉没什么必要用ctBlocking。
  Host: string。设置要连接的服务端的域名,比如'http://www.6267.net'/这样子,改变该属性将同时把Address属性设为空字符串。
  Port: Integer。设置要连接的服务端的端口,范围为1到65535,虽然属性可以设置为64K甚至以上,但实际使用的值为 Port and $FFFF。
  Service: string。设置要连接的服务端的服务名称。实际上是通过API搜索本地的%windir%\SERVICES文件,并翻译为相应的端口值。
  Socket: TClientWinSocket。成员类,里面大部分都是只读的属性,在连接建立后可以获得本地和对方的IP与端口。此外,Handle属性是WSAAsyncSelect所指定接收消息的隐藏窗体,而SocketHandle则为真正的SOCKET句柄,可以通过它来调用Socket API。Data属性可以保存一个指针、类、或者任何其他的32位值,对于TClientSocket来说用处不大,毕竟一般说来一个程序只用到固定数量的TClientSocket,没有必要通过这种方式保存各个TClientSocket的相关数据,但使用TServerSocket的时候,就可以通过这种机制动态分配内存,保存数据,下面会解释到。

  TServserSocket也是类似的,但自然就只能设置本地要监听的端口/服务,要设置的内容少了。不过需要注意的是,ServerType限制了要不用异步模式,要不就使用TServerSocket提供的多线程方式,在多线程方式下,ThreadCacheSize属性设定可以循环使用的线程数目,也就是说要保留的线程数目的最小值。
  Socket: TServerWinSocket。包含一个Connections属性,是TCustomWinSocket的数组,TCustomWinSocket是TClientWinSocket的父类,只比TClientSocket少了一个ClientType的属性(由TServerSocket.Socket.ServerType取代)。由于每个客户端连上服务断后,TServerSocket.Socket.ActiveConnections递增一,TServerSocket.Socket.Connections里面也多了一个TCustomWinSocket对象对应于该连接,因此,如果我们每个连接都需要保存类似结构的数据,就可以通过TCustomWinSocket.Data方便的做到。例如:

type
PClientData = ^TClientData;
TClientData = record
  Stream: TMemoryStream;
  Data1: Integer;
  Data2: string;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);//Socket形参已经给出了发生事件的Connections数组的相应元素,可以直接使用
var
ClientData: PClientData;
begin
  New(Client);
  Client.Stream := TMemoryStream.Create;
  Data1 := 0;
  Data2 := '';
  Socket.Data := Client;
end;

这样子,就可以为每个动态的连接动态分配内存,保存对应的数据。当动态分配内存的数据不再需要使用的时候,比如在OnClientDisconnect事件里面,应该使用Dispose(PClientData(Socket.Data))来释放内存。

  另外,OnRead事件和OnClientRead事件大家使用起来应该没有问题了,在对方发送的数据到达时,事件就会发生,但OnWrite和OnClientWrite事件在什么时候才会发生呢?Delphi的帮助并没有说明。根据我的实验,OnWrite和OnClientWrite事件发生的情况为:首先是使用了SendBuf或者SendText成员函数发送数据,并且函数由于Winsock的缓冲内存不足而返回错误;然后,在Winsock将缓冲内存中的数据发送出去后,就会发送消息到控件的隐藏窗口,从而使到控件调用OnWrite或者OnClientWrite事件处理过程。实际操作中,我们在发送数据的时候,首先应该循环分批使用SendBuf发送数据,直到函数返回-1,如果数据发送完之前,函数都是成功的,那么数据就发送完毕了,否则,将会产生OnWrite事件,在OnWrite事件内,同样也应该循环发送数据,直到得到-1的返回值,以便数据没有发送完的时候,可以继续产生OnWrite事件。由于这第一次发送数据跟OnWrite里面有重复的部分,可以首先初始化传输,然后把所有循环传输的代码都放到OnWrite里面:

procedure TForm1.Button1Click(Sender: TObject);
var Stream: TFileStream;
begin
  if not ClientSocket.Active then Exit;
  Stream := TFileStream.Create('c:\command.com', fmOpenRead or fmShareDenyWrite);
  ClientSocket1.Socket.Data := Stream;
  ClientSocket1Write(self, ClientSocket1.Socket);
end;

procedure TForm1.ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
var buf: array[0..65535] of Char;
  i: Integer;
begin
  repeat
    i := TFileStream(Socket.Data).Read(buf, 65536);
    if Socket.SendBuf(buf, 65536) = -1 then begin
      TFileStream(Socket.Data).Seek(-i, soFromCurrent);
      Exit;
    end;
  until i <> 65536;
  Socket.Close;
end;

  最后,Delphi的控件由于使用了Exception处理,只要有Winsock函数返回错误值,控件就会raise Exception,自动弹出错误框,非常讨厌,其实可以在OnError事件里面处理这些错误,然后将ErrorCode设置为0,就不会产生Exception了。




原作者:machine
来 源:广外女生
  • 打赏
  • 举报
回复
用winsocket技术,,

在d5中相对的控件是serversocket ,clientsocket

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧