Repensar la enseñanza de la programación
Servidor:
Usar el sistema;
Usar el sistema. recolectar. Genérico;
Uso del sistema. Modelo de componentes;
Utilizar el sistema. Datos;
Utilizar el sistema. Dibujo;
Usa el sistema. Texto;
Usa el sistema. Windows Forms
Usa el sistema. Net .Sockets
Usa System.Net;
Usa System. Reflexionar;
Utilizar el sistema. Diagnóstico;
Utilizar el sistema. Texto .Expresión regular;
Espacio de nombres msgServer
{
Clase parcial pública frmServer: Formulario
{
Socket de socket privado;
Dirección IP privada myIP
Punto final IPEndPoint privado;
Punto int privado;
Socket de cliente de socket privado p>
Montaje privado culo=null
Sistema privado. IO . Stream stream = null
Sistema privado. Media . SoundPlayer pl
Txt de cadena privada
Bytes privados[] bs = nuevos bytes[512];
Servidor público frm()
{
inicializar componente();
ass = ensamblado. getexecutionassembly();
corriente = culo. GetManifestResourceStream("servidor de mensajes. msg. wav");
pl = nuevo sistema. Media.SoundPlayer(stream);
}
//Selección de fuente
private void btnFont_Click(remitente del objeto, EventArgs e)
{
diálogo de fuente font = nuevo diálogo de fuente();
Fuente. ShowEffects = true
Fuente. ShowColor = true
Fuente. MinSize = 12;
Fuente. Fuente = nueva Fuente(" cursiva _ GB 2312 ", 18, estilo de fuente. negrita
Fuente. color=color. azul;
if (Font. ShowDialog() == DialogResult. OK)
{
rtxtSend. Fuente = fuente. Fuente;
rtxtEnviar. ForeColor = fuente. Color;
}
}
//Comenzar a escuchar
vacío privado btnStart_Click(remitente del objeto, EventArgs e)
{
Sistema. Threading.Thread th1 = nuevo sistema. threading.Thread(para conectar);
th1. start();
}
//Desconectar
Vacío privado ToConnect()
{
Probar
{
miIP = Dirección IP. Parse(txtIP.text.Trim()); //IP
punto = transformar. ToInt32(txtPoint.
text.Trim()); //punto
endPoint = new IPEndPoint(myIP, point); //terminal
socket = new Socket(AddressFamily.Internet, SocketType. stream, tipo de protocolo.TCP);
Socket. Bind(punto final); //Enlazar
socket. listening(3); //Hasta 3 personas pueden conectarse al mismo tiempo.
EstadoLbl. Text = "El servidor ya está funcionando...";
clientSocket = Socket. aceptar(); //Esperando aceptación
//Al conectar
if (clientSocket. Connected)
{
LblStatus. Texto = "La conexión se ha establecido.";
while(true)
{
Intentar
{
Socket de cliente. recibir(bs, bs. longitud, 0);
reproducción local();
rtxtMsg. AppendText(system. text . encoding . unicode . getstring(bs));
}
Catch {lblStatus. Text = "La conexión se ha perdido.";}
}
}
}
Capturar { txtIP. foco(); txtIP. seleccionar todo();MessageBox. Show("Error de IP o error de punto");}
}
//Detener monitoreo
Vacío privado btnStop_Click(Remitente del objeto, EventArgs e) p>
{
Prueba
{
outlet. Cerrar(3);
LblStatus. Text = "La supervisión se ha detenido.";
}
Captura
{
LblStatus. Text = "Aún no se ha establecido ninguna conexión.";
}
}
Vacío privado frmServer_KeyPress(Remitente del objeto, KeyPressEventArgs e)
{
}
Vacío privado frmServer_KeyDown(Remitente del objeto, KeyEventArgs e)
{
Si ((e . Control & amp&e.KeyCode == Claves Intro)| realizar clic(); //Haga clic para enviar.
}
}
//Enviar mensaje
vacío privado btnSend_Click(objeto remitente, EventArgs e)
{
if(RTX send.Text.Trim() == " ")
Regresar;
si no(RTX send.Text.Trim ( ).ToLower() == "clear()")
{
rtxtMsg. clear();
rtxtEnviar. Texto =
Regresar;
}
si no (Regex.is coincide (RTX send.Text.Trim().
ToLower(),@"^[zoom(]+[\d]+[)]$"))
{
cadena str = rtxtSend. texto . para bajar();
int tamaño = Convertir. ToInt32(String. Substring. LastIndexOf('(') + 1,
str. IndexOf(')') - str. LastIndexOf('(')-1)); >Mensaje Rtxt. Fuente = nueva fuente ("宋体"), tamaño, estilo de fuente. Negrita);
Regresar;
}
si no (Regex.is coincide(RTX send.Text.Trim().ToLower(), @ " ^[abajo(]+[\d]+[)]$"))
{
cadena str = rtxtSend. texto . para bajar();
Tamaño de cadena = str. subcadena. LastIndexOf('(') + 1, cadena. IndexOf(')') - cadena. LastIndexOf('(')-1);
If (Convert.ToInt32(size)>rtxtMsg.TextLength)
Return;
}
p>si no (Regex.is match(RTX send.Text.Trim().ToLower(),@"^[up(]+[\d]+[)]$"))
{
cadena str = rtxtSend. texto . para bajar();
Tamaño de cadena = str. subcadena. LastIndexOf('(') + 1, cadena. IndexOf(')') - cadena. LastIndexOf('(')-1);
}
else if(RTX send.Text.Trim().ToLower() == "exit(0)")
{
Esto. cerrar();
regresar;
}
intentar
{
byte[] bs = nuevo Byte[512];
String user = null
If (txtUser.Text.Trim() == "Ingrese su nombre aquí" || txtUser.Text. Trim() = = " ")
{
Usuario = " I
bs = codificación . unicode . getbytes(string . format("La otra parte dijo: ({ 0}) \ r \ n {1} \ r \ n ", datetime.now.tostring(), envío RTX . text . trim());
}
Otro
{
bs = codificación . unicode . getbytes(cadena . formato(" { 0 } significa: ({1}) \ r \ n {2} \ r \ n " , txtuser.text.trim(), datetime.now.tostring(), rtting.
usuario = txtUser.text.Trim();
}
ClientSocket. enviar(bs, bs. longitud, 0); // enviar
Txt = cadena.
Format("{0} significa: ({1}) \ r \ n {2} \ r \ n ", usuario, datetime.now.tostring(), RTX enviar . text . trim());
int tempLen = rtxtMsg. texto. Longitud;
rtxtMsg. AppendText(txt);
rtxtMsg. Seleccionar(tempLen, txt. length);
RtxtMsg. SelectionFont = newFont("ì", 10);
rtxtMsg. ColorSelección = color. Rojo;
rtxtEnviar. clear();
}
Capturar {MessageBox. display("¡No se ha establecido ninguna conexión, no se pueden enviar datos!");}
}
//Cerrar el socket
Private void frmServer_FormClosing(object sender, FormClosingEventArgs e)
{
Intenta
{
//Cierra la conexión
socket. Cerrar(3);
}
catch(excepción){ }
Finalmente
{
foreach (El proceso p está en progreso. GetProcesses())
{
if (p.ProcessName == Aplicación. Nombre del producto)
Página (abreviatura de página ) kill();
}
}
}
Vacío privado frmServer_Load(Remitente del objeto, EventArgs e)
{
foreach(el proceso p está en progreso. GetProcesses())
{
if(p . nombre del proceso = = aplicación . nombre del producto ) //Ya comenzó.
{
Si (p.Id!= process.getcurrentprocess().id) // no es el proceso actual.
{
Página (abreviatura de página) kill();
}
}
}
}
Casilla de verificación de anulación privada 1_CheckedChanged(Remitente del objeto, EventArgs e)
{
Esto. Más alto = checkBox1. Marcado;
}
}
}
Cliente:
Utilizar el sistema;
Usa el sistema. recolectar. Genérico;
Uso del sistema. Modelo de componentes;
Utilizar el sistema. Datos;
Utilizar el sistema. Dibujo;
Usa el sistema. Texto;
Usa el sistema. Windows Forms
Usa System.Net;
Usa System. Net .Sockets
Utiliza el sistema. Diagnóstico;
Utilizar el sistema. Texto .Expresión regular;
Espacio de nombres smgClient
{
Clase parcial pública frmClient: Formulario
{
dirección IP privada ip; //ip
punto final privado; //punto
socket privado; //socket
Sistema privado. IO . Stream stream = null
Sistema privado.
Reflexión . Asamblea culo = null
Sistema privado. Media . SoundPlayer pl = null
Txt de cadena privada
Bytes privados[] bs = nuevos Bytes[512];
Cliente público()
{
inicializar componente();
ass = system. reflexión. ensamblaje. getexecutionassembly();
flujo = culo. GetManifestResourceStream(" Cliente SMG . msg . wav ");
pl = nuevo sistema. Media.SoundPlayer(stream);
}
//Solicitar conexión
Vacío privado btnRequestConnect_Click(Remitente del objeto, EventArgs e)
{
Sistema. Threading.Thread th = nuevo sistema. Threading.Thread(this.para conectar);
th. start();
}
//Conectar al servidor
Vacío privado ToConnect()
{
Pruebe
{
IP = Dirección IP. Parse(txtIP. text. Trim());
int punto = ConvertToInt32(txtPoint. text. Trim());
punto final = nuevo IPEndPoint(IP, punto);
//Crear socket
socket = nuevo socket (AddressFamily. Internet, SocketType. Stream, Protocol Type. TCP
//Create Connect
salida. Conexión (punto final);
//Conexión exitosa
LblStatus. Text = "Conexión exitosa.";
while(true)
{
Socket. recibir(bs, bs. longitud, 0);
reproducción local();
rtxtMsg. AppendText(system. text . encoding . unicode . getstring(bs)
}
}
catch (FormatException)
{ Cuadro de mensaje. Show("Error de IP o error de punto");}
catch (ArgumentNullException)
{ MessageBox. Show("Error de IP o error de punto");}
Catch (Excepción)
{
LblStatus. Text = "Error de conexión, motivo: el servidor se ha detenido."; btnFont_Click (Remitente del objeto, EventArgs e)
{
fuente de diálogo de fuente = nueva fuente de diálogo();
Fuente. ShowEffects = true
Fuente. ShowColor = true
Fuente. MinSize = 12;
Fuente.
Fuente = nueva fuente(" cursiva _ GB 2312 ", 18, estilo de fuente. negrita
Fuente. color=color. azul;
if (Font. ShowDialog() == DialogResult. OK)
{
rtxtSend. Fuente = fuente. Fuente;
rtxtEnviar. ForeColor = fuente. Color;
}
}
//Cerrar la conexión
private void btnCloseConnect _ Click (remitente del objeto, parámetro de evento e)
{
Prueba
{
outlet. close();
LblEstado. Text = "La conexión se ha cerrado.";
}
Captura
{
LblStatus. Text = "Aún no se ha establecido ninguna conexión.";
}
}
//Enviar mensaje
privado void btnSend_Click( objeto Remitente, EventArgs e)
{
if(RTX send.Text.Trim() == " ")
Return;
else if(RTX send.Text.Trim().ToLower() == "clear()")
{
rtxtMsg. clear();
rtxtEnviar. Texto =
Regresar;
}
si no (Regex.is coincide(RTX send.Text.Trim().ToLower(),@"^ [zoom(]+[\d]+[)]$”))
{
cadena str = rtxtSend. texto . para bajar();
int tamaño = Convertir. ToInt32(String. Substring. LastIndexOf('(') + 1,
str. IndexOf(')') - str. LastIndexOf('(')-1)); >Mensaje Rtxt. Fuente = nueva fuente ("fuente"), tamaño, estilo de fuente. Negrita);
Regresar;
}
si no (Regex.is coincide(RTX send.Text.Trim().ToLower(), @ " ^[abajo(]+[\d]+[)]$"))
{
cadena str = rtxtSend. texto . para bajar();
Tamaño de cadena = str. subcadena. LastIndexOf('(') + 1, cadena. IndexOf(')') - cadena. LastIndexOf('(')-1);
If (Convert.ToInt32(size)>rtxtMsg.TextLength)
Return;
}
p>si no (Regex.is match(RTX send.Text.Trim().ToLower(),@"^[up(]+[\d]+[)]$"))
{
cadena str = rtxtSend. texto . para bajar();
Tamaño de cadena = str. subcadena. LastIndexOf('(') + 1, cadena. IndexOf(')') - cadena.
LastIndexOf('(')-1);
}
else if(RTX send.Text.Trim().ToLower() == "exit(0)")
{
Esto. cerrar();
regresar;
}
intentar
{
byte[] bs = nuevo Byte[512];
String user = null
If (txtUser.Text.Trim() == "Ingrese su nombre aquí" || txtUser.Text. Trim() = = " ")
{
Usuario = " I
bs = codificación . unicode . getbytes(string . format("La otra parte dijo: ({ 0}) \ r \ n {1} \ r \ n ", datetime.now.tostring(), RTX enviar . text . trim());
}
Otro
{
bs = codificación . unicode . getbytes(cadena . formato(" { 0 } significa: ({1}) \ r \ n {2} \ r \ n " , txtuser.text.trim(), datetime.now.tostring(), rtting.
usuario = txtUser.text.Trim();
}
Socket.Send(bs, bs.Length, 0); //Enviar
Txt = "{0} significa: ({1}) \r\n{2 } \ r \ n. ", usuario, datetime.now.tostring(), RTX enviar . text . trim());
int tempLen = rtxtMsg. text. length;
rtxtMsg.AppendText(txt );
rtxtMsg.Selection(tempLen, txt.Length);
RtxtMsg.SelectionFont("ì", 10);
rtxtMsg.SelectionColor=rojo ;
rtxtSend.clear();
catch(excepción)
{MessageBox.Show("¡La conexión no se ha establecido! ¡No se pueden enviar datos! " + ej. mensaje);}
}
//Evita abrir varios
Private void frmClient_Load(Object sender, EventArgs e)
{
foreach(El proceso p está en progreso. GetProcesses())
{
if(p . nombre del proceso == aplicación . nombre del producto)//Hay un proceso.
{
Si (p.Id!= process.getcurrentprocess().id) // no es el proceso actual.
{
Página (abreviatura de página) kill();
}
}
}
}
Vacío privado frmClient_FormClosing(Remitente del objeto, FormClosingEventArgs e)
{
Probar
{< / p>
Zócalo.
close();
}
catch(excepción){ }
Finalmente
{
foreach( El proceso p está en curso GetProcesses())
{
if (p.ProcessName == Aplicación. Nombre del producto)
Página (abreviatura de página) kill ();
}
}
}
private void frmClient_KeyDown(objeto remitente, KeyEventArgs e)
{
If ((e . Control &&e.KeyCode == Keys.Enter)| |(e.Alt&&e.KeyCode == Keys.s)) p>
{
btnEnviar. realizar clic();
}
}
Casilla de verificación de anulación privada 1_CheckedChanged(Remitente del objeto, EventArgs e)
{
Esto. Más alto = checkBox1. Marcado;
}
}
}