Cómo: Utilizar sockets
Actualización: noviembre 2007
.NET Compact Framework admite las comunicaciones de red basadas en socket. Para otras consideraciones específicas de la programación de sockets en .NET Compact Framework, vea Programación de sockets.
En este ejemplo se crea una instancia de una aplicación de servidor y una instancia de una aplicación cliente, y se muestra cómo las dos aplicaciones se comunican a través de una conexión basada en socket. La dirección del host local se utiliza para el servidor, por lo que ambas aplicaciones se ejecutan en el cliente. Una instancia del servidor debe estar en ejecución para que el cliente se pueda comunicar con él.
Para establecer la comunicación a través de una conexión de socket
Cree una clase denominada Server que implemente Form y agregue el código siguiente a la clase:
Private Shared output As String = "" Public Sub New() End Sub Public Sub createListener() ' Create an instance of the TcpListener class. Dim tcpListener As TcpListener = Nothing Dim ipAddress As IPAddress = Dns.GetHostEntry("localhost").AddressList(0) Try ' Set the listener on the local IP address. ' and specify the port. tcpListener = New TcpListener(ipAddress, 13) tcpListener.Start() output = "Waiting for a connection..." Catch e As Exception output = "Error: " + e.ToString() MessageBox.Show(output) End Try While True ' Always use a Sleep call in a while(true) loop ' to avoid locking up your CPU. Thread.Sleep(10) ' Create a TCP socket. ' If you ran this server on the desktop, you could use ' Socket socket = tcpListener.AcceptSocket() ' for greater flexibility. Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient() ' Read the data stream from the client. Dim bytes(255) As Byte Dim stream As NetworkStream = tcpClient.GetStream() stream.Read(bytes, 0, bytes.Length) Dim helper As New SocketHelper() helper.processMsg(tcpClient, stream, bytes) End While End Sub Shared Sub Main() Application.Run(New Server()) End Sub
static string output = ""; public Server() { } public void createListener() { // Create an instance of the TcpListener class. TcpListener tcpListener = null; IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0]; try { // Set the listener on the local IP address // and specify the port. tcpListener = new TcpListener(ipAddress, 13); tcpListener.Start(); output = "Waiting for a connection..."; } catch (Exception e) { output = "Error: " + e.ToString(); MessageBox.Show(output); } while (true) { // Always use a Sleep call in a while(true) loop // to avoid locking up your CPU. Thread.Sleep(10); // Create a TCP socket. // If you ran this server on the desktop, you could use // Socket socket = tcpListener.AcceptSocket() // for greater flexibility. TcpClient tcpClient = tcpListener.AcceptTcpClient(); // Read the data stream from the client. byte[] bytes = new byte[256]; NetworkStream stream = tcpClient.GetStream(); stream.Read(bytes, 0, bytes.Length); SocketHelper helper = new SocketHelper(); helper.processMsg(tcpClient, stream, bytes); } } static void Main() { Application.Run(new Server()); }
En la clase Server, proporcione una manera de iniciar el servidor. Por ejemplo, llame a createListener en el evento Click de un botón.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Me.createListener() End Sub
private void button1_Click(object sender, EventArgs e) { this.createListener(); }
Cree una clase denominada SocketHelper y agregue el código siguiente a la clase:
Class SocketHelper Private mscClient As TcpClient Private mstrMessage As String Private mstrResponse As String Private bytesSent() As Byte Public Sub processMsg(ByVal client As TcpClient, ByVal stream As NetworkStream, ByVal bytesReceived() As Byte) ' Handle the message received and ' send a response back to the client. mstrMessage = Encoding.ASCII.GetString(bytesReceived, 0, bytesReceived.Length) mscClient = client mstrMessage = mstrMessage.Substring(0, 5) If mstrMessage.Equals("Hello") Then mstrResponse = "Goodbye" Else mstrResponse = "What?" End If bytesSent = Encoding.ASCII.GetBytes(mstrResponse) stream.Write(bytesSent, 0, bytesSent.Length) End Sub End Class
class SocketHelper { TcpClient mscClient; string mstrMessage; string mstrResponse; byte[] bytesSent; public void processMsg(TcpClient client, NetworkStream stream, byte[] bytesReceived) { // Handle the message received and // send a response back to the client. mstrMessage = Encoding.ASCII.GetString(bytesReceived, 0, bytesReceived.Length); mscClient = client; mstrMessage = mstrMessage.Substring(0, 5); if (mstrMessage.Equals("Hello")) { mstrResponse = "Goodbye"; } else { mstrResponse = "What?"; } bytesSent = Encoding.ASCII.GetBytes(mstrResponse); stream.Write(bytesSent, 0, bytesSent.Length); } }
El servidor crea instancias de esta clase cuando un cliente se conecta a él.
Cree una clase denominada Client que implemente Form y agregue el código siguiente a la clase:
Shared Sub Connect(ByVal serverIP As String, ByVal message As String) Dim output As String = "" Try ' Create a TcpClient. ' The client requires a TcpServer that is connected ' to the same address specified by the server and port ' combination. Dim port As Int32 = 13 Dim client As New TcpClient(serverIP, port) ' Translate the passed message into ASCII and store it as a byte array. Dim data(255) As [Byte] data = System.Text.Encoding.ASCII.GetBytes(message) ' Get a client stream for reading and writing. ' Stream stream = client.GetStream(); Dim stream As NetworkStream = client.GetStream() ' Send the message to the connected TcpServer. stream.Write(data, 0, data.Length) output = "Sent: " + message MessageBox.Show(output) ' Buffer to store the response bytes. data = New [Byte](255) {} ' String to store the response ASCII representation. Dim responseData As String = String.Empty ' Read the first batch of the TcpServer response bytes. Dim bytes As Int32 = stream.Read(data, 0, data.Length) responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes) output = "Received: " + responseData MessageBox.Show(output) ' Close everything. stream.Close() client.Close() Catch e As ArgumentNullException output = "ArgumentNullException: " + e.ToString() MessageBox.Show(output) Catch e As SocketException output = "SocketException: " + e.ToString() MessageBox.Show(output) End Try End Sub Shared Sub Main() Application.Run(New Client()) End Sub
public Client() { this.MinimizeBox = false; } static void Connect(string serverIP, string message) { string output = ""; try { // Create a TcpClient. // The client requires a TcpServer that is connected // to the same address specified by the server and port // combination. Int32 port = 13; TcpClient client = new TcpClient(serverIP, port); // Translate the passed message into ASCII and store it as a byte array. Byte[] data = new Byte[256]; data = System.Text.Encoding.ASCII.GetBytes(message); // Get a client stream for reading and writing. // Stream stream = client.GetStream(); NetworkStream stream = client.GetStream(); // Send the message to the connected TcpServer. stream.Write(data, 0, data.Length); output = "Sent: " + message; MessageBox.Show(output); // Buffer to store the response bytes. data = new Byte[256]; // String to store the response ASCII representation. String responseData = String.Empty; // Read the first batch of the TcpServer response bytes. Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); output = "Received: " + responseData; MessageBox.Show(output); // Close everything. stream.Close(); client.Close(); } catch (ArgumentNullException e) { output = "ArgumentNullException: " + e; MessageBox.Show(output); } catch (SocketException e) { output = "SocketException: " + e.ToString(); MessageBox.Show(output); } } static void Main() { Application.Run(new Client()); }
En la clase Client, proporcione una manera de que el usuario se conecte al servidor. Por ejemplo, llame al método Connect en el evento Click de un botón.
Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) ' In this code example, use a hard-coded ' IP address and message. Dim serverIP As String = "localhost" Dim message As String = "Hello" Connect(serverIP, message) End Sub
private void button1_Click(object sender, EventArgs e) { // In this code example, use a hard-coded // IP address and message. string serverIP = "localhost"; string message = "Hello"; Connect(serverIP, message); }
Compile las aplicaciones cliente y de servidor.
Implemente ambas aplicaciones en el dispositivo.
Ejecute la aplicación de servidor en el dispositivo e inicie el servidor.
Ejecute la aplicación cliente en el dispositivo y establezca una conexión con el servidor.
Compilar el código
El programa cliente requiere referencias a los siguientes espacios de nombres:
El programa de servidor requiere referencias a los siguientes espacios de nombres: