Sincronizar la hora del sistema
con un Servidor NIST
DJP Sincro Tray
Fecha: 15 de Septiembre 2003 (18/Sep/2003)
Autor: Paulo Conde pauloconde@cantv.net
Muchas veces queremos sincronizar nuestro sistema con la hora exacta, (por ejemplo si desarrollamos una aplicación que venda números de lotería siempre querremos que sepa a que hora va a ser el sorteo). Esto es posible mediante un servidor de hora (NIST). La conexión con el servidor se efectúa utilizando TCP. Las direcciones de algunos servidores las coloque en un ComboBox (si alguien conoce otras le agradecería me lo informara -ver lista adicional-), el puerto en que normalmente escuchan es el puerto 13.
La aplicación se ejecuta como un icono en la barra de tareas, y efectúa actualizaciones cada cierto tiempo.
Muestro aquí las partes más importantes de la aplicación:
Public Sub New() MyBase.New() 'El Diseñador de Windows Forms requiere esta llamada. InitializeComponent() 'Oculto el icon tray para comprobar primero que no existan otras instancias de la aplicación ejecutándose NotifyIcon1.Visible = False End Sub ' 'Para determinar si existen instancias previas de la aplicación en ejecución Function PrevInstance() As Boolean If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then Return True Else Return False End If End Function ' 'Conexión con el servidor nist y obtención y conversión de la cadena obtenida Private Sub mnuSincronizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuSincronizar.Click Dim tcp As New System.Net.Sockets.TcpClient Try With tcp 'Establecemos la conexión con el servidor en el puerto en que este escuchando .Connect(cmbServidor.Text, Val(txtPuerto.Text)) Dim data As [Byte]() Dim stream As System.Net.Sockets.NetworkStream = tcp.GetStream() ' 'Leemos la hora y la fecha data = New [Byte](256) {} Dim responseData As [String] = [String].Empty Dim bytes As Int32 = stream.Read(data, 0, data.Length) ' 'Cortamos la parte de la cadena que nos interesa responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes).Trim(Chr(10)).Substring(6, 17) ' 'La convertimos a un formato de fecha manejable responseData = responseData.Substring(6, 2) & "/" & responseData.Substring(3, 2) & "/" & responseData.Substring(0, 2) & " " & responseData.Substring(9) ' 'Cerramos la conexión tcp.Close() ' 'Asignamos la hora a nuestro sistema 'Le resto cuatro horas porque en Venezuela la hora es -4GMT 'deben adaptar el valor a su zona horaria TimeOfDay = DateTime.Parse(responseData).AddHours(-4) Today = DateTime.Parse(responseData).AddHours(-4) End With Catch c As System.Net.Sockets.SocketException MsgBox("No se puede conectar con el servidor", MsgBoxStyle.Critical, "DJP Sincro Tray") End Try End Sub ' 'Si no hay otras instancias en ejecución se muestra el icon tray sino salimos Private Sub frmSetup_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load If PrevInstance() Then Me.Close() Else 'Sincronizamos la hora y la fecha mnuSincronizar_Click(Me, New System.EventArgs) 'Mostramos el icono en la barra de estado de Windows 'las sincronizaciones se efectuaran automáticamente NotifyIcon1.Visible = True End If End SubEspero les sea útil.
Fichero con el código de ejemplo (DJPSincroTray.zip - Tamaño 14.8 KB)
Nota del Guille:
Otros servidores NIST (aquí se incluyen también los incluidos en el código original)
ashe.cs.tcd.ie bernina.ethz.ch black-ice.cc.vt.edu boulder.nist.gov clepsydra.dec.com clock.psu.edu clock.tricity.wsu.edu constellation.ecn.uoknor.edu delphi.cs.ucla.edu eagle.tamu.edu esavax.esa.lanl.gov fartein.ifi.uio.no fuzz.psc.edu gazette.bcm.tmc.edu gilbreth.ecn.purdue.edu harbor.ecn.purdue.edu heechee.esa.lanl.gov india.Colorado.EDU jane.jpl.nasa.gov kuhub.cc.ukans.edu lane.cc.ukans.edu lib1.tcd.ie libra.rice.edu louie.udel.edu molecule.ecn.purdue.edu nic.near.net noc.near.net ntp-0.cso.uiuc.edu ntp-1.cso.uiuc.edu ntp-2.cso.uiuc.edu ntp.adelaide.edu.au ntp.cox.smu.edu ntp.css.gov ntp.olivetti.com ntp.univ-lyon1.fr ntp0.cornell.edu ntp0.strath.ac.uk ntp1.strath.ac.uk ntp2.strath.ac.uk ntp3.strath.ac.uk ntp4.strath.ac.uk salmon.maths.tcd.ie sundial.columbia.edu tick.cs.unlv.edu time-a.nist.gov time-b.nist.gov time-nw.nist.gov time.nist.gov time-A.timefreq.bldrdoc.gov time-B.timefreq.bldrdoc.gov time-C.timefreq.bldrdoc.gov timeserver.cs.umb.edu tmc.edu,tock.cs.unlv.edu vtserf.cc.vt.edu wuarchive.wustl.edu yoyo.aarnet.edu.au zeus.tamu.edu