Red de conocimiento informático - Conocimiento informático - Ayuda a escribir un ejemplo de C#: problema de comunicación entre dos procesos.

Ayuda a escribir un ejemplo de C#: problema de comunicación entre dos procesos.

//Cliente:

usando System;

usando System.Collections.Generic;

usando System.ComponentModel;

usando System.Data;

usando System.Drawing;

usando System.Text;

usando System.Windows.Forms;

//Referencia de espacio de nombres agregada

usando System.Net;

usando System.Net.Sockets;

usando System.Threading;

usando System.IO;

espacio de nombres ChatClient

{

clase parcial pública FormClient: Formulario

{

private bool isExit = false;

delegado privado void SetListBoxCallback(string str);

SetListBoxCallback privado setListBoxCallback;

cliente TcpClient privado

p>

NetworkStream privado networkStream;

BinaryReader privado br;

BinaryWriter privado bw;

FormClient público()

{

InitializeComponent();

listBoxStatus.HorizontalScrollbar = true;

setListBoxCallback = new SetListBoxCallback(SetListBox);

}

botón de anulación privadaConnect_Click(remitente del objeto, EventArgs e)

{

prueba

{

//Real cuando se usa él, cambie Dns.GetHostName() al nombre de dominio del servidor

client = new TcpClient(Dns.GetHostName(), 51888);

SetListBox(string.Format("Esta máquina Punto final: {0}", cliente.Cliente.Local

EndPoint));

SetListBox("La conexión al servidor se estableció correctamente");

}

catch

{

SetListBox("Error al conectarse al servidor");

return;

}

buttonConnect.Enabled = false; p> //Obtener el flujo de red

networkStream = client.GetStream();

//Usar el flujo de red como un objeto binario de lectura y escritura, usando codificación UTF8

br = new BinaryReader(networkStream);

bw = new BinaryWriter(networkStream);

SendString("Iniciar sesión"); = new Thread(new ThreadStart (ReceiveData));

threadReceive.Start();

}

private void RecibirData()

{

while (isExit == false)

{

string recibirString = null;

intentar

{

//Leer la cadena del flujo de red

//Este método determinará automáticamente el prefijo de longitud de la cadena y leerá la cadena según el prefijo de longitud

recibirString = br .ReadString();

}

catch

{

//Se producirá una excepción cuando el socket subyacente no existe

p>

SetListBox("Error al recibir datos"

}

if (receiveString == null)

{

si (isExit == false)

{

MessageBox.Show("¡Se perdió el contacto con el servidor!");

}

break

}

SetListBox( "Recibir:" recibirString);

}

Application.Exit();

}

cadena privada ReadString(int dataLength)

{

string recibirString

try

{

//Leer del flujo de red String

//Este método determinará automáticamente el prefijo de longitud de la cadena y leerá la cadena de acuerdo con el prefijo de longitud

ceivedString = br.ReadString();

return recibirString

}

catch

{

//Se producirá una excepción cuando el socket subyacente no exista

SetListBox("Error al recibir datos");

return null

}

}

private void SendString; (string str)

{

try

{

//Escribe la cadena en el flujo de red, este método se agregará automáticamente caracteres Prefijo de longitud de cadena

bw.Write(str);

bw.Flush()

SetListBox(string.Format("Enviar: {0} " , str));

}

catch

{

SetListBox("¡Error en el envío!");

}

}

setListBox privado vacío (string str)

{

if (listBoxStatus.InvokeRequired == true)

{

this.Invoke(setListBoxCallback, str);

}

else

{

listBoxStatus. Items.Add(str);

listBoxStatus.SelectedIndex = listBoxStatus.Items.Count - 1;

listBoxStatus.ClearSelected();

}

}

botón vacío privadoSend_Click(objeto remitente, EventArgs e)

{

SendString("Talk", textBoxSend.Text);

p>

textBoxSend.Clear();

}

privado vacío FormClient_FormClosing(objeto remitente, FormClosingEventArgs e)

{

//el cliente es nulo antes de conectarse al servidor

if (client != null)

{

SendString("Cerrar sesión" );

isExit = true;

br.Close();

bw.Close();

cliente.Close( );

}

}

textBoxSend_KeyPress privado vacío (remitente del objeto, KeyPressEventArgs e)

{

if (e.KeyChar == (char)Keys.Return)

{

buttonSend_Click(null, null);

}

}

}

}

//Servidor:

usando System;

usando System.Collections .Genérico;

p>

usando System.ComponentModel;

usando System.

Datos;

usando System.Drawing;

usando System.Text;

usando System.Windows.Forms;

//Agregar referencia de espacio de nombres

usando System.Net;

usando System.Net.Sockets;

usando System.Threading;

usando System. IO;

espacio de nombres ChatServer

{

clase parcial pública FormServer: Formulario

{

/ /Conectado Usuario

System.Collections.Generic.Listlt;Usergt; userList = new Listlt;Usergt;();

Oyente TcpListener;

delegado privado void SetListBoxCallback( string str);

setListBoxCallback privado setListBoxCallback;

delegado privado void SetComboBoxCallback(Usuario usuario);

SetComboBoxCallback privado setComboBoxCallback;

/ /Dirección IP local utilizada

IPAddress localAddress;

//Puerto de escucha

private int port = 51888;

private TcpListener myListener;

formServer público()

{

InitializeComponent();

listBoxStatus.HorizontalScrollbar = true;

p>

setListBoxCallback = nuevo SetListBoxCallback(SetListBox);

setComboBoxCallback = nuevo SetComboBoxCallback(AddComboBoxitem

IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName()); ;

localAddress = addrIP[0];

buttonStop.Enabled = false;

}

//Comenzar a escuchar

Evento de clic del botón

botón vacío privadoStart_Click(objeto remitente, EventArgs e)

{

myListener = new TcpListener(localAddress, port);

myListener.Start();

SetListBox(string.Format("Empiece a escuchar las conexiones del cliente en {0}:{1}", dirección local, puerto));

//Crear un hilo para escuchar las solicitudes de conexión del cliente

ThreadStart ts = new ThreadStart(ListenClientConnect);

Thread myThread = new Thread(ts);

myThread .Start();

botónInicio.Enabled = falso;

botónStop.Enabled = verdadero

}

// Recibir conexión de terminal de clientes

private void ListenClientConnect()

{

while (true)

{

TcpClient newClient = null;

try

{

//Espera a que el usuario ingrese

newClient = myListener.AcceptTcpClient() ;

}

catch

{

//AcceptTcpClient() generará una excepción cuando hagas clic en "Dejar de escuchar" o salgas este formulario

p>

// Entonces puedes usar esta excepción para salir del bucle

break

}

//Cada cada vez que se acepta una conexión de cliente, cree un El bucle de hilo correspondiente recibe la información enviada por el cliente

ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData);

Thread threadReceive = new Thread(pts );

p>

Usuario usuario = nuevo Usuario(nuevoCliente);

threadReceive.Start(usuario

userList.Add(usuario);

AddComboBoxitem; (usuario);

SetListBox(string.Format("[{0}] enter", newClient.Client.RemoteEndPoint));

SetListBox(string.Format("Conexión actual Número de usuarios: {0}", userList.Count));

}

}

//Recibir y procesar información del cliente, 1 por hilo de cliente , los parámetros se utilizan para distinguir qué cliente

private void RecibirDatos(objeto obj)

{

Usuario usuario = (Usuario)obj;

TcpClient client = user.client;

//Si salir normalmente del hilo de recepción

bool normalExit = false;

//Se utiliza para controlar si para salir del bucle

bool exitWhile = false;

while (exitWhile == false)

{

string recibirString = null;

try

{

//Lee la cadena del flujo de red

//Este método determinará automáticamente el prefijo de longitud de la cadena y Lea la cadena según el prefijo de longitud

recibirString = user.br.ReadString();

}

catch

{

p>

//Se producirá una excepción cuando el socket subyacente no exista

SetListBox("Error al recibir datos");

}

if ( recibirString == null)

{

if (normalExit == false)

{

//Si se detiene la escucha, Conectado es falso

if (client.Connected == true)

{

SetListBox (string.Format(

"Perdí contacto con [{0}], dejó de recibir información del usuario", client.Client.RemoteEndPoint)); p> }

break;

}

SetListBox(string.Format("De [{0}]: {1}", usuario.cliente. Client.RemoteEndPoint, recibirString));

string[] splitString = recibirString.Split(', ');

string sendString = ""; (splitString[0])

{

case "Iniciar sesión":

//Formato: Iniciar sesión

sendString = "Hola, ¡Soy el servidor, hola!";

SendToClient(user, sendString);

break;

case "Logout":

//Formato: Cerrar sesión

SetListBox(string.Format("[{0}]Salir", usuario.client.Client.RemoteEndPoint));

normalExit = true; /p>

exitWhile = true;

break;

case "Talk":

//Formato: conversación, contenido de la conversación

> SetListBox(string.Format("[{0}] dijo: {1}", client.Client.RemoteEndPoint,

recibirString.Substring(splitString[0].Length 1))); p>

descanso;

predeterminado:

SetListBox("Qué significa:" recibirString);

}

}

userList.Remove(usuario);

client.Close()

SetListBox(string. Format(" Número de usuarios conectados actualmente: {0}", userList.Count));

}

private void SendToClient(Usuario usuario, string str)

{

try

{

//Escribe la cadena en la secuencia de la red. Este método agregará automáticamente el prefijo de longitud de la cadena

<. p> usuario. bw.Write(str);

usuario.bw.Flush();

SetListBox(string.Format("Enviar a [{0}]: {1 }", usuario .client.Client.RemoteEndPoint, str));

}

catch

{

SetListBox(string. Format("A [{0}]Error al enviar información", user.client.Client.RemoteEndPoint));

}

}

vacío privado AddComboBoxitem(Usuario usuario)

{

if (comboBoxReceiver.InvokeRequired == true)

{

this.Invoke(setComboBoxCallback, usuario);

p>

}

más

{

comboBoxReceiver.Items.Add(user.client.Client.RemoteEndPoint);

}

}

setListBox privado vacío ( string str)

{

if (listBoxStatus.InvokeRequired == true)

{

this.Invoke(setListBoxCallback, str) ;

}

else

{

listBoxStatus.Items.Add(str);

listBoxStatus. SelectedIndex = listBoxStatus.Items.Count - 1;

listBoxStatus.ClearSelected();

}

}

//Dejar de escuchar Evento de clic del botón

private void buttonStop_Click(object sender, EventArgs e)

{

SetListBox(string.Format("Número de usuarios conectados actualmente: { 0 }", userList.Count));

SetListBox("¡Empiece a detener el servicio y cierre la sesión de los usuarios uno por uno!");

for (int i = 0; i lt; lista de usuarios .Count; i )

{

comboBoxReceiver.Items.Remove(lista de usuarios[i].client.Client.RemoteEndPoint);

lista de usuarios [i].br.Close();

lista de usuarios[i].bw.Close();

lista de usuarios[i].client.Close();

}

//Al dejar de escuchar, deja que myListener.AcceptTcpClient() genere una excepción y salga del hilo de escucha

myListener.Stop(); > botónStart.Enabled = verdadero;

botónStop.Enabled = falso;

<

p> }

//Enviar el evento Click del botón

botón vacío privadoSend_Click(objeto remitente, EventArgs e)

{

int index = comboBoxReceiver.SelectedIndex;

if (index == -1)

{

MessageBox.Show("Seleccione primero el receptor y luego haga clic en Haga clic en [Enviar]");

}

else

{

Usuario usuario = (Usuario)listadeusuarios[índice] ;

SendToClient(usuario, textBoxSend.Text);

textBoxSend.Clear()

}

}

;

private void FormServer_FormClosing(remitente del objeto, FormClosingEventArgs e)

{

//Cuando sales directamente sin hacer clic para comenzar a escuchar, myListener es nulo

if ( myListener != null)

{

buttonStop_Click(null, null);

}

}

textBoxSend_KeyPress privado vacío (remitente del objeto, KeyPressEventArgs e)

{

if (e.KeyChar == (char)Keys.Return)

{

botónEnviar_Clic(nulo, nulo);

}

}

}

}