Notas de estudio de Java-Comunicación de socket

1. Zócalo

        Socket se refiere al puerto del enlace de comunicación entre procesos bajo un modelo de programación específico. Un socket incluye dos flujos, un flujo de entrada y un flujo de salida.
        En el lenguaje Java, la conexión del socket TCP / IP la realiza la clase en el paquete java.net.

1. Ideas de implementación

  1. El servidor asigna un número de puerto y escucha las solicitudes de conexión en el puerto. Si el cliente solicita una conexión, el servidor usa el método accept () para abrir la conexión del socket.
  2. El cliente establece una conexión en el puerto del host.
  3. El servidor y el cliente usan InputStream y OutputStream para comunicarse.

2. Proceso de programación:

1. 创建Socket。
2. 打开连接到socket的输入/输出流。
3. 按照一定的协议对Socket进行读/写操作。
4. 关闭Socket。

En segundo lugar, el zócalo del cliente

        La clase SeverSocket está diseñada como un "oyente" que no hace nada antes de esperar a que el cliente se establezca.

1. Constructor

public Socket(String hostName, int port)
	创建一个本地主机与给定名称的主机和端口的套接字连接。
public Socket(InetAddress ipAddress, int port)
	用一个预先存在的InetAddress对象和端口创建一个套接字。

2. Funciones de uso común

Int getPoet():取得与该Socket对象连接的远程端口。
Int getLocalPort():取得与该Socket连接的本地端口。
InetAddress getInetAddress():取得与Socket对象相关的InetAddress。

public InputStream getInputStream():获取与调用套接字相关的InputStream类。
public OutputStream getOutputStream():获取与调用套接字相关的OutputStream类。
void close():关闭InputStream和OutputStream。
Dar una castaña:
import java.io.*;
import java.net.*;

public class hostDemo
{
    public static void main(String[] args)
    {
        try
        {
            Socket connection = new Socket("www.baidu.com", 80);
            System.out.println("建立连接...");
            System.out.println("===========");
            System.out.println("本地连接信息:");
            System.out.println("地址:" + connection.getLocalAddress());
            System.out.println("端口:" + connection.getLocalPort());
            System.out.println("===========");
            System.out.println("远程连接信息:");
            System.out.println("地址:" + connection.getInetAddress());
            System.out.println("端口:" + connection.getPort());
        } catch (UnknownHostException e1)
        {
            System.out.println("未知主机:" + "www.baidu.com");
        } catch (IOException e2)
        {
            System.out.println("IOException:" + e2);
        }
    }
}

Resultado de la operación:

建立连接...
===========
本地连接信息:
地址:/192.168.1.5
端口:4280
===========
远程连接信息:
地址:www.baidu.com/14.215.177.39
端口:80

En tercer lugar, el socket del servidor

        Java tiene diferentes clases de socket para crear aplicaciones de servidor. La clase ServerSocket se usa para crear un servidor y escuchar conexiones de programas de clientes locales o remotos a través de puertos públicos.
        ServerSocket es completamente diferente de la clase Socket. Al crear una clase ServerSocket, establecerá conexiones con clientes de interés.

1. Constructor

ServerSocket(int port):在指定端口创建队列长度为50的服务器套接字。
ServerSocket(int port, int maxQueue):在指定端口创建一个最大队列长度为maxQueue的服务器套接字。
ServerSocket(int port, int maxQueue,InetAddress localAddress): 在指定端口创建一个最大队列长度为maxQueue的服务器套接字。在一个多地址主机上,localAddress指定该套接字约束吃的IP地址。

2. El método accept () de la clase ServerSocket

        Este método es una llamada modular que espera a que el cliente comience la comunicación y luego regresa con un Socket normal que se utiliza para comunicarse con el cliente. El método accept () es un método de bloqueo. Después de la llamada, esperará la solicitud del cliente hasta que el cliente se inicie y solicite conectarse al mismo puerto.

Dar una castaña:
/*
服务器造5432端口提供服务,一直等待客户的请求。
如果客户发来请求,服务器端将发出提示信息,显示"Hello World!",关闭客户端连接,停止数据传输。
*/
public class hostDemo
{
    public static void main(String[] args)
    {
        ServerSocket server = null; // 创建服务器
        Socket socket1;
        String sendString = "Hello World!";
        OutputStream slout;
        DataOutputStream dos;
        try{
            server  = new ServerSocket(5432);   // 服务器在端口5432上开辟新的服务
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        while (true)
        {
            try{
                socket1 = server.accept();  // 保持监听状态
                slout = socket1.getOutputStream();  // 通过Socket取得的数据流
                dos = new DataOutputStream(slout);
                dos.writeUTF(sendString);   // 将数据流统一编码为UTF
                slout.close();  // 接受数据流关闭
                socket1.close();    // Socket关闭
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
27 artículos originales publicados · Me gusta1 · Visitas 996

Supongo que te gusta

Origin blog.csdn.net/qq_41320782/article/details/105565942
Recomendado
Clasificación