Sincronizar la hora del sistema
con un Servidor NIST
DJP Sincro Tray
Fecha: 15 de Septiembre 2003 (18/Sep/2003)
Autor: Paulo Conde [email protected]
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