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 Sub

Espero 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

ir al índice