Você está na página 1de 16

CURSO: SISTEMAS DISTRIBUIDOS

TEMA: SOCKET EN JAVA


DOCENTE: ING. LINTOL CONTRERAS
SALAS
ALUMNO:VLADIMIR CLAUDIO
ESCOBEDO MIRANDA
CÓDIGO: 121159

ABANCAY – PERÚ

2019
Introducción
El término programación de socket se refiere a la escritura de programas que
se ejecutan en varios equipos en los que los dispositivos están conectados
entre sí mediante una red.

Hay dos protocolos de comunicación que uno puede usar para la


programación de socket: Protocolo de datagramas de usuario (UDP) y
Protocolo de control de transferencia (TCP) .

La principal diferencia entre los dos es que UDP no tiene conexión, lo que
significa que no hay sesión entre el cliente y el servidor, mientras que TCP está
orientado a la conexión, lo que significa que primero debe establecerse una
conexión exclusiva entre el cliente y el servidor para que la comunicación
tenga lugar.

Este tutorial presenta una introducción a la programación de sockets sobre


redes TCP / IP y muestra cómo escribir aplicaciones cliente / servidor en Java.
UDP no es un protocolo convencional y, como tal, puede que no se encuentre
a menudo.
1. Configuración del Socket cliente - servidor
Java proporciona una colección de clases e interfaces que se
encargan de los detalles de comunicación de bajo nivel entre el cliente
y el servidor.
La mayoría de ellos están contenidos en el paquete java.net , por lo
que necesitamos realizar la siguiente importación:
import java.net.*;
También necesitamos el paquete java.io que nos proporciona flujos de
entrada y salida para escribir y leer mientras nos comunicamos:
import java.io.*;
En aras de la simplicidad, ejecutaremos nuestros programas de cliente y
servidor en la misma computadora. Si los ejecutáramos en diferentes
computadoras en red, lo único que cambiaría es la dirección IP, en este
caso, usaremos localhost en 127.0.0.1.

2. Proyecto del Socket

Será una aplicación de comunicación bidireccional donde el cliente


saluda al servidor y el servidor responde.

Creamos el servidor

import javax.swing.*;
import java.net.*;
import java.io.*;
public class formulario extends javax.swing.JFrame {
/*variable globales para encender y apagar el servidor*/
Thread mutiplesconexiones;
ServerSocket servidor;
Socket socket;
int puerto=9000;
PrintStream salida;
BufferedReader entrada;
public formulario() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated
Code">
private void initComponents() {

jLabel1 = new javax.swing.JLabel();


jTextField1 = new javax.swing.JTextField();
ON_OFF = new javax.swing.JToggleButton();
jScrollPane1 = new javax.swing.JScrollPane();
textarea = new javax.swing.JTextArea();
jLabel2 = new javax.swing.JLabel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLO
SE);
setTitle("Servidor");
setCursor(new
java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
setResizable(false);

jLabel1.setForeground(new java.awt.Color(51, 51, 255));


jLabel1.setText("Puerto de red:");

jTextField1.setEditable(false);
jTextField1.setText("9000");
jTextField1.setCaretColor(new java.awt.Color(51, 51,
255));

ON_OFF.setForeground(new java.awt.Color(51, 51, 255));


ON_OFF.setText("PULSA EL BOTON PARA ENCENDAR");
ON_OFF.addActionListener(new
java.awt.event.ActionListener() {
public void
actionPerformed(java.awt.event.ActionEvent evt) {
ON_OFFActionPerformed(evt);
}
});

textarea.setColumns(20);
textarea.setRows(5);
jScrollPane1.setViewportView(textarea);

jLabel2.setForeground(new java.awt.Color(51, 51, 255));


jLabel2.setText("Para APAGAR, vuelva a PRESIONAR");

javax.swing.GroupLayout layout = new


javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEA
DING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELA
TED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE, 197,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(208, 208, 208))
.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Ali
gnment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(33, 33, 33)
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE, 571,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(207, 207, 207)
.addComponent(jLabel2))
.addGroup(layout.createSequentialGroup()
.addGap(177, 177, 177)
.addComponent(ON_OFF,
javax.swing.GroupLayout.PREFERRED_SIZE, 256,
javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(76, Short.MAX_VALUE))
);
layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEA
DING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Ali
gnment.BASELINE)
.addComponent(jLabel1)
.addComponent(jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(ON_OFF,
javax.swing.GroupLayout.PREFERRED_SIZE, 50,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabel2)
.addGap(28, 28, 28)
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE, 189,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(33, Short.MAX_VALUE))
);

pack();
}// </editor-fold>

private void
ON_OFFActionPerformed(java.awt.event.ActionEvent evt) {
try{
if(ON_OFF.isSelected()){
/*iniciamos el servidor*/
servidor = new ServerSocket(puerto);
textarea.append("Servidor Encendido \n\n");
/*construimos un hilo de proceso para atender a
multiples clientes*/
mutiplesconexiones = new Thread("Hilos de procesos"){
public void run(){
do{
try{
/*establecemos conexcion y
esperamos algun cliente*/
socket = new Socket();
socket = servidor.accept();
/*recibimos datos del cliente*/
entrada = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String mensajedelcliente =
entrada.readLine();
/*le enviamos datos al cliente*/
salida = new
PrintStream(socket.getOutputStream());
String mensajedelservidor =
JOptionPane.showInputDialog("El cliente a enviado el siguiente
mensaje: "+mensajedelcliente+"\nRepuesta del servidor:");
salida.println(mensajedelservidor);
/*mostramos los resultados en nuestra
aplicacion*/
textarea.append("Conexion
Establecida\nCliente: "+mensajedelcliente+"\nServidor:
"+mensajedelservidor+"\nConexion Apagada\n\n");
/*cerramos el Buffer de datos para esperar
otro cliente*/
entrada.close();
salida.close();
}catch(Exception error){}
}while(true);
}
};
mutiplesconexiones.start();//ejecutamos hilo de
proceso
}
else{
/*detenemos el servidor*/
mutiplesconexiones.stop();
servidor.close();
socket.close();
textarea.append("Servidor Apagado \n\n");
}
}catch(Exception error){
JOptionPane.showMessageDialog(this,"Error de
Conexion","ERROR",0);
}
}

public static void main(String args[]) {


//<editor-fold defaultstate="collapsed" desc=" Look and
feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available,
stay with the default look and feel.
* For details see
http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/p
laf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(formulario.class.getName()).l
og(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(formulario.class.getName()).l
og(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(formulario.class.getName()).l
og(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex)
{

java.util.logging.Logger.getLogger(formulario.class.getName()).l
og(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new formulario().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JToggleButton ON_OFF;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextArea textarea;
// End of variables declaration
}

Creamos el CLIENTE

import javax.swing.*;
import java.net.*;
import java.io.*;
public class formulario extends javax.swing.JFrame {
public formulario() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed"
desc="Generated Code">
private void initComponents() {

jLabel1 = new javax.swing.JLabel();


ip = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
dato = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
textarea = new javax.swing.JTextArea();

setDefaultCloseOperation(javax.swing.WindowConstants.
EXIT_ON_CLOSE);
setTitle("Cliente");
setResizable(false);

jLabel1.setForeground(new java.awt.Color(51,
51, 255));
jLabel1.setText("Introduzca el IP del
servidor:");

ip.setText("127.0.0.1");

jLabel2.setForeground(new java.awt.Color(51,
51, 255));
jLabel2.setText("Mensaje a enviar al
servidor:");

jButton1.setForeground(new java.awt.Color(51,
51, 255));
jButton1.setText("Enviar MENSAJE al
SERVIDOR");
jButton1.addActionListener(new
java.awt.event.ActionListener() {
public void
actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

textarea.setColumns(20);
textarea.setRows(5);
jScrollPane1.setViewportView(textarea);

javax.swing.GroupLayout layout = new


javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Al
ignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.Grou
pLayout.Alignment.TRAILING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.Grou
pLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(jLabel2))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPla
cement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)

.addGroup(layout.createParallelGroup(javax.swing.Grou
pLayout.Alignment.LEADING, false)
.addComponent(dato)
.addComponent(ip,
javax.swing.GroupLayout.DEFAULT_SIZE, 237,
Short.MAX_VALUE)))

.addGroup(layout.createSequentialGroup()
.addGap(0, 37,
Short.MAX_VALUE)

.addGroup(layout.createParallelGroup(javax.swing.Grou
pLayout.Alignment.LEADING)

.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE, 498,
javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()

.addComponent(jButton1,
javax.swing.GroupLayout.PREFERRED_SIZE, 434,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(23, 23,
23)))))
.addGap(48, 48, 48))
);
layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Al
ignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.Grou
pLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(ip,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)

.addGroup(layout.createParallelGroup(javax.swing.Grou
pLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(dato,
javax.swing.GroupLayout.PREFERRED_SIZE, 60,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(jButton1,
javax.swing.GroupLayout.PREFERRED_SIZE, 37,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE, 170,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(31,
Short.MAX_VALUE))
);

jButton1.getAccessibleContext().setAccessibleName("En
viar MENSAJE al SERVIDOR");

pack();
}// </editor-fold>

private void
jButton1ActionPerformed(java.awt.event.ActionEvent
evt) {
try{
Socket cliente;
int puerto=9000;
BufferedReader entrada;
PrintStream salida;
/*establecemos conexcion con el
servidor*/
cliente = new Socket(ip.getText(),
puerto);
/*le enviamos datos al servidor*/
salida = new
PrintStream(cliente.getOutputStream());
salida.println(dato.getText());
/*recibimos datos del servidor*/
entrada = new BufferedReader(new
InputStreamReader(cliente.getInputStream()));
String mensajedelservidor =
entrada.readLine();
/*mostramos los resultados en nuestra
aplicacion*/
textarea.append("Conexion
Establecida\nCliente: "+dato.getText()+"\nServidor:
"+mensajedelservidor+"\nConexion Apagada\n\n");
dato.setText(String.valueOf(""));
/*nos desconectamos del servidor*/
entrada.close();
salida.close();
cliente.close();
}catch(Exception
error){JOptionPane.showMessageDialog(this,"Error de
Conexion","ERROR",0);}
}

public static void main(String args[]) {


//<editor-fold defaultstate="collapsed"
desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not
available, stay with the default look and feel.
* For details see
http://download.oracle.com/javase/tutorial/uiswing/lo
okandfeel/plaf.html
*/
try {
for
(javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName()))
{
javax.swing.UIManager.setLookAndFeel(info.getClassNam
e());
break;
}
}
} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(formulario.class.g
etName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(formulario.class.g
etName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(formulario.class.g
etName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch
(javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(formulario.class.g
etName()).log(java.util.logging.Level.SEVERE, null,
ex);
}
//</editor-fold>
java.awt.EventQueue.invokeLater(new
Runnable() {
public void run() {
new formulario().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JTextField dato;
private javax.swing.JTextField ip;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea textarea;
// End of variables declaration
}
3. Funcionamiento
1. Activamos el SERVIDOR

2. Y lo encendemos:

3. Activamos el Cliente
4. Escribimos el mensaje:

5. Al servidor le aparecerá el siguiente mensaje.


6. Le vamos a responder para establecer la comunicación.

7. Observamos las ventandas principales de ambos


8. Para terminar la comunicaion pulsamos el botón.

Você também pode gostar