¿Cómo utilizar el socket Java para transmitir paquetes de datos personalizados?
La siguiente es una descripción de cuatro puntos:
1. ¿Qué es Socket?
Dos programas en la red intercambian datos a través de una conexión de comunicación bidireccional. Un extremo de este enlace bidireccional se llama Socket. Socket se usa generalmente para realizar la conexión entre el cliente y el servidor. Socket es una interfaz de programación muy popular para el protocolo TCP/IP. Un socket está determinado únicamente por una dirección IP y un número de puerto.
Sin embargo, los tipos de protocolo admitidos por Socket no se limitan a TCP/IP, por lo que no existe una conexión necesaria entre los dos. En el entorno Java, la programación de Socket se refiere principalmente a la programación de red basada en el protocolo TCP/IP.
2. El proceso de comunicación de Socket
El lado del servidor escucha para ver si hay una solicitud de conexión en un puerto determinado. El lado del cliente envía una solicitud de conexión al lado del servidor. y el lado del servidor envía una solicitud de conexión al lado del cliente. El final devuelve un mensaje de aceptación. Se establece una conexión. Tanto el lado del Servidor como el del Cliente pueden comunicarse entre sí mediante métodos como Enviar y Escribir.
Para un Socket completamente funcional, debe contener la siguiente estructura básica y su proceso de trabajo incluye los siguientes cuatro pasos básicos:
(1) Crear Socket
<; p>(2) Abrir el flujo de entrada/salida conectado al Socket(3) Realizar operaciones de lectura/escritura en el Socket de acuerdo con un determinado protocolo; Cierre el socket (en aplicaciones reales, el cierre que se muestra no se utiliza. Aunque muchos artículos recomiendan esto, en mi programa, puede deberse a que el programa en sí es relativamente simple y los requisitos no son altos, por lo que no tiene ningún impacto. .)
3. Crear Socket
Crear Socket
Java proporciona dos clases, Socket y ServerSocket, en el paquete java.net, que se utilizan para representar el cliente y el servidor de conexiones bidireccionales respectivamente. Estas son dos clases muy bien encapsuladas y muy cómodas de usar.
Su método de construcción es el siguiente:
Socket(dirección InetAddress, puerto int);
Socket(dirección InetAddress, puerto int, flujo booleano);
Socket (String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(SocketImpl impl)
Socket(String host , int puerto, InetAddress localAddr, int localPort)
Socket(InetAddress dirección, int puerto, InetAddress localAddr, int localPort)
ServerSocket(int puerto);
ServerSocket (int port, int backlog);
ServerSocket(int port, int backlog, InetAddress bindAddr)
Donde dirección, host y puerto son la dirección IP de la otra parte en la conexión bidireccional, respectivamente, nombre de host y número de puerto, stream indica si el socket es un socket de flujo o un socket de datagrama, localPort indica el número de puerto del host local, localAddr y bindAddr son las direcciones de la máquina local (la. dirección de host de ServerSocket), impl es la clase principal del socket, que se puede usar. La creación de serverSocket se puede usar para crear Socket. El recuento representa el número máximo de conexiones que el servidor puede admitir. Por ejemplo: Learning Video Network
Socket client = new Socket("127.0.01.", 80);
ServerSocket server = new ServerSocket(80);
Tenga en cuenta que debe tener cuidado al elegir un puerto. Cada puerto proporciona un servicio específico. Sólo dando el puerto correcto se puede obtener el servicio correspondiente. El sistema reserva los números de puerto del 0 al 1023. Por ejemplo, el número de puerto de servicio es 21 y el número de puerto de servicio ftp es 23. Por lo tanto, cuando elegimos un número de puerto, es mejor elegir un número mayor que 1023. prevenir conflictos.
Si ocurre un error al crear el socket, se generará una IOException, la cual deberá ser manejada en el programa. Entonces, al crear un Socket o ServerSocket, debes detectar o lanzar una excepción.
4. Programa cliente/servidor simple
1. Programa cliente
importar java.io.*;
importar java .net .*;
clase pública TalkClient {
public static void main(String args[]) {
try{
Socket socket =new Socket("127.0.0.1", 4700);
//Enviar una solicitud de cliente al puerto local 4700
BufferedReader sin=new BufferedReader(new InputStreamReader(System .in ));
//Construya el objeto BufferedReader a partir del dispositivo de entrada estándar del sistema
PrintWriter os=new PrintWriter(socket.getOutputStream());
/ /Obtener el flujo de salida del objeto Socket y construir el objeto PrintWriter
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//Obtener la entrada desde la secuencia de objetos Socket y construya el objeto BufferedReader correspondiente
String readline;
readline=sin.readLine() //Leer una cadena de la entrada estándar del sistema
while(!readline.equals("bye")){
//Si la cadena leída de la entrada estándar es "bye", detenga el ciclo
os .println( readline);
// Envía la cadena leída desde la entrada estándar del sistema al servidor
os.flush()
// Actualizar; el flujo de salida, lo que hace que el servidor reciba la cadena inmediatamente
System.out.println("Client:" readline);
//Imprime la cadena leída en la salida estándar del sistema
System.out.println("Server:" is.readLine());
//Leer una cadena del servidor e imprimirla en la salida estándar
readline=sin.readLine(); //Leer una cadena de la entrada estándar del sistema
} //Continuar el ciclo
os.close(); Flujo de salida del socket
is.close(); //Cerrar flujo de entrada del socket
socket.close(); //Cerrar socket
}catch(Exception) e) {
System.out.println("Error" e); //Si ocurre un error, imprime el mensaje de error
}
}
}
2. Programa del lado del servidor
importar java.io.*
importar java.net.*; p>
importar java.applet.Applet;
>clase pública TalkServer{
public static void main(String args[]) {
prueba{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//Crear un ServerSocket para escuchar las solicitudes de los clientes en el puerto 4700
}catch(Exception e ) {
System.out.println("no se puede escuchar:" e);
//Error, imprimir mensaje de error
}
Socket socket=null;
try{
socket=server.accept();
//Utiliza aceptar() para bloquear y esperar para solicitudes de clientes. Client
//Cuando llega la solicitud, se genera un objeto Socket y la ejecución continúa
}catch(Exception e) {
System. out.println("Error ." e);
//Error, imprimir mensaje de error
}
Línea de cadena;
BufferedReader is=new BufferedReader( new InputStreamReader(socket.getInputStream()));
//Obtiene el flujo de entrada del objeto Socket y construye el objeto BufferedReader correspondiente
PrintWriter os= newPrintWriter(socket.getOutputStream());
//Obtiene el flujo de salida del objeto Socket y construye el objeto PrintWriter
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in ));
//Construye un objeto BufferedReader a partir del dispositivo de entrada estándar del sistema
System.out.println("Client:" is.readLine());
//Imprimir en la salida estándar de la cadena leída por el cliente
line=sin.readLine();
//Leer una cadena de la entrada estándar p>
while(!line .equals("bye")){
//Si la cadena es "bye", deja de repetir
os.println(line) ;
//Envía la cadena al cliente
os.flush();
//Actualiza el flujo de salida para que el Cliente reciba la cadena inmediatamente
System.out.println("Server:" line);
//Imprime la cadena leída en la salida estándar del sistema
System.out.println ("Cliente: " is.readLine());
//Leer una cadena del Cliente e imprimirla en la salida estándar
line=sin.readLine();
//Leer una cadena de la entrada estándar del sistema
}//Continuar el ciclo
os.close() //Cerrar el flujo de salida del Socket
es .close(); //Cerrar el flujo de entrada del Socket
socket.close(); //Cerrar el Socket
server.close() //Cerrar el ServerSocket
}catch(Exception e){
System.out.println("Error: " e);
//Error, imprimir mensaje de error
}
}
}