Programación de red .NET - Comunicación TCP

1. Conceptos básicos de programación de redes:

1.Internet

        Es conectar computadoras en diferentes regiones para formar una red de área local, una red de área metropolitana o una red de área amplia. Las computadoras en diferentes regiones geográficas están interconectadas con equipos externos especializados para formar un sistema de red potente y a gran escala, de modo que muchas computadoras puedan transmitir información fácilmente entre sí y compartir recursos como hardware, software e información de datos.

2. Red informática 

        A través de los medios de transmisión, las instalaciones de comunicación y los protocolos de comunicación de red, se conectan varias computadoras con funciones independientes y sus dispositivos externos en la misma ubicación geográfica para realizar un sistema de transmisión de datos y recursos compartidos.

3. Protocolo de comunicación

Para realizar la comunicación en una red informática, debe haber algunas normas de protocolo de comunicación y se deben establecer estándares para el código de transmisión, la estructura del código, el control de errores de los pasos de control de transmisión, etc.

4. Interfaz de comunicación

Para permitir el diálogo entre dos nodos, se debe establecer una herramienta de comunicación (es decir, una interfaz) entre ellos para permitir el intercambio de información entre ellos.

5. Capas de red

       1. Dado que la conexión entre nodos es muy complicada, al especificar el protocolo, descomponga los componentes complejos en algunos componentes simples y luego combínelos. El método compuesto más utilizado es el método jerárquico, es decir, la misma capa puede comunicarse, la capa superior puede llamar a la siguiente capa y no tiene relación con la siguiente capa.

        2. TCP/IP es una familia de protocolos, que también se divide en cuatro capas: capa de aplicación, capa de transporte, capa de red de interconexión, capa de interfaz (física + capa de enlace de datos)

        3. El modelo de protocolo de comunicación de red OSI es un modelo de referencia, mientras que el protocolo TCP/IP es el estándar de facto. El protocolo TCP/IP se refiere al modelo OSI, pero no se divide estrictamente de acuerdo con el estándar de siete capas estipulado por OSI, sino que solo se divide en cuatro capas, lo que será más simple. Cuando hay demasiadas capas, es difícil distinguir a qué capa pertenece un determinado protocolo.

2. Tres elementos de la programación en red 

1. dirección IP

        Para que las computadoras en la red se comuniquen entre sí, se debe asignar un número de identificación a la computadora, a través del cual se debe especificar la computadora para recibir datos y la computadora para identificar al remitente, y la dirección IP es el número de identificación, que es la identificación del dispositivo.

1.1 Las direcciones IP se dividen en dos categorías

  1. IPv4: se asigna una dirección de 32 bits a cada host conectado a la red. Según la normativa TCP/IP, las direcciones IP se expresan en binario, y la longitud de cada dirección IP es de 32 bits, es decir, 4 bytes.
  2. IPv6: Debido al vigoroso desarrollo de Internet, la demanda de direcciones IP está aumentando, pero los recursos de direcciones de red son limitados, lo que hace que la asignación de IP sea cada vez más tensa. Para expandir el espacio de direcciones, el espacio de direcciones se redefine a través de IPv6 y la longitud de la dirección es de 128 bits. Cada grupo de 16 bytes se divide en 8 grupos de números hexadecimales, lo que resuelve el problema de recursos de dirección de red insuficientes.

1.2 Clase InetAddress (use la clase InetAddress para representar IP en Java)

        Métodos comúnmente utilizados:

Cadena getHostAddress () Devuelve la cadena de dirección IP (en representación de texto)
Cadena getHostName () Devuelve el nombre de host para esta dirección IP
Byte[] obtenerDirección() Devuelve la dirección IP original de este objeto InetAddress

2. Puerto

2.1  Concepto:

        La comunicación de red es esencialmente comunicación entre dos aplicaciones, y cada computadora tiene muchas aplicaciones. La dirección IP identifica de forma única el dispositivo en la red y el número de puerto identifica de forma única la aplicación en el dispositivo, es decir, el identificador de la aplicación.

2.2  Número de puerto:

        Un número entero representado por dos bytes, su rango de valores es 0~65535. Entre ellos, los números de puerto entre 0 y 1023 se usan para algunos servicios y aplicaciones de red conocidos, y las aplicaciones comunes necesitan usar números de puerto superiores a 1024. Si el número de puerto está ocupado por otro servicio o aplicación, el programa actual no podrá iniciarse.

2.3 Clase IntetSocketAddress

        Contiene información de IP y puerto, a menudo utilizada en la comunicación de socket. Esta clase implementa la dirección numérica del socket (dirección IP + número de puerto) y no depende de ningún protocolo.

        Métodos comúnmente utilizados:

InetAddress getAddress() getInetAddress
Int getPuerto () obtener el número de puerto
Cadena getHostName() obtener nombre de host

3. Acuerdo

        Se pueden conectar varias computadoras a través de una red informática, y las computadoras en la misma red deben cumplir con ciertas reglas al conectarse y comunicarse, al igual que un automóvil en la carretera debe obedecer las reglas de tránsito. En las redes informáticas, estas reglas de conexión y comunicación se denominan protocolos de comunicación de red. Hace regulaciones unificadas sobre el formato de transmisión de datos, la velocidad de transmisión y los pasos de transmisión, y ambas partes en la comunicación deben cumplirlo al mismo tiempo para completar el intercambio de datos.

3.1 Protocolo UDP

  1. Protocolo de datagramas de usuario
  2. UDP es un protocolo de comunicación pre-inalámbrico , es decir, cuando se transmiten datos, el remitente y el receptor de los datos no establecen una conexión lógica . En pocas palabras, cuando una computadora envía datos a otra computadora, el remitente enviará los datos sin confirmar la existencia del receptor. De manera similar, cuando el receptor recibe los datos, no le informará al remitente si ha recibido los datos.
  3. Debido a que el protocolo UDP consume menos recursos y tiene una alta eficiencia de comunicación, generalmente se usa para transmisión de audio, video y datos ordinarios.
  4. Por ejemplo, las videoconferencias suelen utilizar el protocolo UDP, porque incluso si uno o dos paquetes de datos se pierden ocasionalmente en esta situación, no tendrá un gran impacto en el resultado de aceptación. Sin embargo, cuando se usa el protocolo UDP para transmitir datos, debido a la naturaleza sin conexión de UDP, no se puede garantizar la integridad de los datos, por lo que no se recomienda usar el protocolo UDP cuando se transmiten datos importantes.

3.2 Protocolo TCP

  • Protocolo de control de transmisión (Protocolo de control de transmisión)
  • El protocolo TCP es un protocolo de comunicación orientado a la conexión, es decir, antes de transmitir datos, se establece una conexión lógica entre el extremo de envío y el extremo de recepción, y luego se transmiten los datos.Proporciona una conexión de datos confiable y sin errores entre dos computadoras. En la conexión TCP, el cliente y el servidor deben estar claramente definidos. Dado que el cliente envía una solicitud de conexión al servidor, cada creación de conexión debe pasar por un "apretón de manos de tres vías";

3.3 Apretón de manos de tres vías

En el protocolo TCP, en la etapa de preparación del envío de datos, existen tres interacciones entre el cliente y el servidor para asegurar la confiabilidad de la conexión

El primer apretón de manos: el cliente envía una solicitud de conexión al servidor y espera a que el servidor confirme

El segundo apretón de manos: el servidor envía una respuesta al cliente, notificando al cliente que se ha recibido la solicitud de conexión.

El tercer apretón de manos: el cliente envía información de confirmación al servidor nuevamente para confirmar la conexión

        Después de completar el establecimiento de la conexión de protocolo de enlace de tres vías, el cliente y el servidor pueden iniciar la transmisión de datos. Debido a esta función orientada a la conexión, el protocolo TCP puede garantizar la seguridad de los datos transmitidos, por lo que se usa ampliamente. Como cargar archivos, descargar archivos, navegar por páginas web.

3.3.1 Principio de comunicación TCP:

        El protocolo de comunicación TCP es un protocolo de red confiable. Establece un objeto Socket en ambos extremos de la comunicación, formando así un enlace virtual de red en ambos extremos de la comunicación. Una vez que se establece el enlace de red virtual, los programas en ambos extremos pueden comunicarse a través del enlace virtual.

  • Use la programación de red Socket basada en el protocolo TCP, use el objeto Socket para representar los puertos de comunicación en ambos extremos
  • El protocolo TCP se basa en el modo de solicitud-respuesta, y el primer programa iniciado por el programa cliente (Cliente)
  • El programa en espera de conexión en la primera comunicación está bloqueado por el programa servidor (Serser)
  • Use el flujo IO para realizar la transmisión de datos

Cuatro, pasos de implementación de TCP (caso de chat)

1. Pasos

1. Especifique un número de puerto en el servidor para crear un ServerSocket y use el método de aceptación para escuchar, lo que bloqueará el subproceso del servidor y esperará las solicitudes de los usuarios.

2. Especifique la IP del host y el número de puerto del servicio en el lado del cliente para crear un socket y conéctese al ServerSocket en el lado del servidor. En este momento, se activa el método de aceptación en el lado del servidor y, al mismo tiempo, devuelve un socket que se comunica con el lado del cliente.

3. Use sockets en el lado del cliente y en el lado del servidor para obtener flujos de entrada/salida de comunicación de red y realice operaciones de lectura/escritura en el socket de acuerdo con un determinado protocolo de comunicación.

4. Una vez completada la comunicación, cierre el socket en el cliente y el servidor respectivamente.

2. Lado del servidor

  1. Crear un objeto ServerSocket (puerto int)        
  2. Use el método de aceptación en el Socket para escuchar la solicitud de conexión del cliente (bloqueando y esperando la función de conexión)
  3. Aceptar y procesar la información solicitada • Devolver el resultado del procesamiento al cliente
  4. Cierre la secuencia y el objeto Socket

3. Cliente

  1. Cree un objeto Socket (host Strng, puerto int)
  2. Enviar una solicitud de conexión al servidor • Enviar una solicitud de servicio al servidor • Recibir el resultado del servicio (respuesta del servicio)
  3. Cierre la secuencia y el objeto Socket

4. Clase ServerSocket

Constructores de uso común: ServerSocket (puerto int) Crea un socket de servidor vinculado al puerto especificado

Métodos comunes: Socket accept() escucha para conectarse a este socket y lo acepta

Java proporciona la clase Socket para el cliente y la clase ServerSocket para el servidor.

Método de construcción:

Socket (dirección InetAddress, puerto int) dirección (dirección IP), puerto (número de puerto)

Cree un socket de transmisión y conéctelo al número de puerto especificado en la dirección IP especificada;

Métodos comunes:

OutoutStream getOutputStream() Devuelve el flujo de salida del socket.
InputStream getInputStream () Devuelve el flujo de entrada del socket.
Apagado nulo Salida() Deshabilitar el flujo de salida del socket 

5. Utilice la función de chat inalámbrico entre el cliente y el servidor

1. servidor

package com.net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 服务器
 * @author 云村小威
 *
 * @2023年7月19日 下午10:02:11
 */
public class Server {

	public static void main(String[] args) throws Exception {
		System.out.println("⁎⁎⁎⁎⁎⁎服务端⁎⁎⁎⁎⁎⁎");

		/* 创建服务器连接对象 */
		ServerSocket ss = new ServerSocket(6666);
		System.out.println("服务器已开启,等待连接...");

		/* 调用accept方法,客服端没有启动连接不能执行下一步(阻塞功能) */
		Socket server = ss.accept();
		System.out.println("客户端连接成功");

		/* 获取输入流,读取客户端发送的数据 */
		InputStream inputStream = server.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

		/* 获取输出流,向客户端回写数据 */
		Scanner zw = new Scanner(System.in);

		OutputStream outputStream = server.getOutputStream();
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream));

		while (true) {
			String readLine = br.readLine();
			System.out.println("客户端 :" + readLine);

			if ("拜拜".equals(readLine)) {
				System.out.println("再见");
				break;
			}

			System.out.println("请输入发送到客户端的内容:");
			String test = zw.next();
			/* 向客户端写入内容 */
			bw.write(test);
			bw.newLine();
			bw.flush();

			if ("拜拜".equals(test)) {
				System.out.println("再见");
				break;
			}
		}

		/* 关闭资源 */
		bw.close();
		outputStream.close();
		br.close();
		inputStream.close();
		server.close();
		ss.close();
	}
}

2. Cliente

package com.net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客户端
 * @author 云村小威
 *
 * @2023年7月19日 下午10:02:00
 */
public class Client {

	public static void main(String[] args) throws Exception {
		System.out.println("⁕⁕⁕⁕⁕客户端⁕⁕⁕⁕⁕");

		/* 创建Socket对象,请求连接 */
		Socket client = new Socket(InetAddress.getByName("127.0.0.1"), 6666);
		System.out.println("服务器连接成功...");

		/* 获取输出流对象,向服务器写入数据 */
		OutputStream outputStream = client.getOutputStream();
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream));

		/* 获取输入流对象,读取服务器数据 */
		InputStream inputStream = client.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

		/* 向服务器发送信息 */
		Scanner zw = new Scanner(System.in);
		while (true) {
			System.out.println("请输入发送到服务器的内容:");
			String test = zw.next();
			/* 向服务器写入内容 */
			bw.write(test);
			bw.newLine();
			bw.flush();
			if ("拜拜".equals(test)) {
				System.out.println("再见");
				break;
			}
			/* 每次读取一个字节数组 */
			String content = br.readLine();
			System.out.println("服务器 : " + content);
			if ("拜拜".equals(content)) {
				System.out.println("再见");
				break;
			}
		}

		/* 关闭资源 */
		br.close();
		inputStream.close();
		bw.close();
		outputStream.close();
		client.close();
	}
}

3. Efecto de versión de consola

209fc2eac0a14234bd5ad4511ee33711.gif

    Gracias por mirar, continuaré actualizando esta columna y actualizaré los subprocesos múltiples y otros conocimientos en el futuro. A continuación, puede usar subprocesos múltiples para realizar la función de chat inalámbrico en tiempo real del formulario, ¡ haga clic para ingresar subprocesos múltiples JAVA  !

Supongo que te gusta

Origin blog.csdn.net/Justw320/article/details/131817953
Recomendado
Clasificación