Programación de la suite TCP
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 = nuevo socket(AddressFamily. Internet, Tipo de socket. Flujo, Tipo de protocolo TCP);
Socket. Vincular(punto final); //Vincular
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 . Amplificador de control ampe.KeyCode == Teclas. Intro) | (e . Alt amp; ampe.KeyCode == Teclas. s))
{
btnSend. realizar clic(); //Haga clic para enviar.
}
}
//Enviar mensaje
private void btnSend_Click(objeto remitente, EventArgs e)
{
if(Envío RTX.
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 ("宋体"), 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() == "Ingresa tu nombre aquí" || txtUser.
Text.Trim() == " ")
{
Usuario = " I
bs = codificación . unicode . getbytes(cadena . formato(" Decir : ({0}) \ r \ n {1} \ r \ n ", datetime.now.tostring(), envío RTX . text . trim());
}
Otro
{
bs = codificación . unicode . getbytes(string . format(" { 0 } significa: ({1}) \ r \ n {2} \ r \ n ", txtuser.text.trim(), datetime.now.tostring(), rtting.
usuario = txtUser.text.Trim();
}
p>
Socket de cliente. Enviar(bs, bs. longitud, 0); //Enviar
Txt = String. \ 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 = nueva fuente("ì", 10 ); p>
rtxtMsg.SelectionColor=red;
rtxtSend. ("¡No se ha establecido conexión, no se pueden enviar datos!");}
}
//Cerrar el socket
Vacío privado frmServer_FormClosing(remitente del objeto, FormClosingEventArgs e)
{
Probar
{
//Cerrar la conexión
Salida cerrada(3.);
}
catch(excepción){ }
Finalmente
{
foreach(proceso p en curso. GetProcesses())
{
if (p.ProcessName == Aplicación. Nombre del producto)
Página (abreviatura de página) kill(); p> p>
}
}
}
Vacío privado frmServer_Load(Remitente del objeto, EventArgs e)
{< / p>
foreach(el proceso p está en progreso. GetProcesses())
{
if(p . nombre del proceso == aplicación . nombre del producto)//ha sido 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:
Usando 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. Red .Sockets
Usa el sistema. Diagnóstico;
Utilizar el sistema. Text.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.";
}
}
//Font
private void 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 ("宋体"), 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.
texto . Recortar();
}
Socket. 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();
}
catch(excepción ex)
{MessageBox. Show("¡La conexión no se ha establecido! ¡No se pueden enviar datos!" ex. mensaje);}
}
//Evite abrir varios
privados void frmClient_Load( Remitente del objeto, 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 amp ampe.KeyCode == Keys. Enter) | | (e . Alt amp; ampe.KeyCode == Keys. s))
{
btnEnviar. realizar clic();
}
}
Casilla de verificación de anulación privada 1_CheckedChanged(Remitente del objeto, EventArgs e)
{
Esto. Más alto = checkBox1. Marcado;
}
}
}