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>
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> 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);
}
}
}
}