Fundamentos de Java, como utilizar Socket basado en el protocolo TCP y UDP

Código específico para el uso de Socket basado en Java

Uso de Socket basado en el protocolo TCP para simular que el cliente envía datos y el servidor recibe datos

    @Test
    public void client() throws IOException {
    
    

        //创建socket对象,指明服务器的ip和端口号
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        Socket socket = new Socket(inetAddress,8899);

        //获取一个输出流,用于输出数据
        OutputStream outputStream = socket.getOutputStream();
        //写出数据
        outputStream.write("我是客户端大姐".getBytes());
        //资源的关闭
        outputStream.close();
        socket.close();
    }

    @Test
    public void server() throws IOException {
    
    
        
        //创建serverSocket,指明自己的端口号
        ServerSocket serverSocket = new ServerSocket(8899);
        //调用accept()方法表示接受来自客户端的socket
        Socket socket = serverSocket.accept();
        //读入收入流的数据
        InputStream inputStream = socket.getInputStream();
        //不建议这么写(会导致数据丢失)
//        byte[] bytes = new byte[5];
//        int len;
//        while((len = inputStream.read(bytes)) != -1) {
    
    
//            String str = new String(bytes,0,len);
//            System.out.println(str);
//        }
        //建议这么写
        ByteArrayOutputStream byteArrayInputStream = new ByteArrayOutputStream();
        byte[] bytes = new byte[10];
        int len;
        while ((len = inputStream.read(bytes)) != -1){
    
    
            byteArrayInputStream.write(bytes,0,len);
        }
        System.out.println(byteArrayInputStream.toString());
        
        //关闭资源
        byteArrayInputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }

El servidor da una respuesta al cliente después de recibir la imagen.

 @Test
    public void client() throws IOException {
    
    

        //创建socket对象,指明服务器的ip和端口号
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        Socket socket = new Socket(inetAddress,8899);

        //获取一个输出流,用于输出数据
        OutputStream outputStream = socket.getOutputStream();
        //写出数据
        File file = new File("三刀流索隆.jpg");

        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] buffer = new byte[20];
        int len;
        while((len = fileInputStream.read(buffer))!= -1){
    
    
            outputStream.write(buffer,0,len);
        }
        //关闭数据的输出
        socket.shutdownOutput();

        //客户端发送完数据,等待服务端相应,把消息相应到控制台。
        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        while((len = inputStream.read(buffer)) != -1){
    
    
           byteArrayOutputStream.write(buffer,0,len);
        }
        System.out.println(byteArrayOutputStream.toString());
        //资源的关闭
        inputStream.close();
        byteArrayOutputStream.close();
        outputStream.close();
        socket.close();
    }

    @Test
    public void server() throws IOException {
    
    

        //创建serverSocket,指明自己的端口号
        ServerSocket serverSocket = new ServerSocket(8899);
        //调用accept()方法表示接受来自客户端的socket
        Socket socket = serverSocket.accept();
        //读入收入流的数据
        InputStream inputStream = socket.getInputStream();

        File file = new File("另一个三刀流索隆.jpg");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        byte[] buffer = new byte[20];
        int len;
        while ((len = inputStream.read(buffer)) != -1){
    
    
            fileOutputStream.write(buffer,0,len);
        }
        System.out.println("服务器接受到图片");

        //服务端接受到数据之后给客户端一个反馈
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("服务端已经接受到来自客户端的数据!".getBytes());

        //关闭资源
        	fileOutputStream.close();
        	outputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
    }
  • El cliente debe ejecutar el siguiente código después de enviar los datos para decirle al servidor que he enviado todos los datos.
    socket.shutdownOutput ();
  • Primero debe iniciar el servidor y luego iniciar el cliente. Porque el protocolo TCP es un protocolo de comunicación que requiere un protocolo de enlace de tres vías para establecer una conexión confiable.
  • ¿Por qué es tres veces, no una, ni dos o más veces?
    La razón es que no se puede establecer una conexión confiable una o dos veces, y no importa cuántas veces, la mejora de la confiabilidad de la conexión es mínima, pero debido al establecimiento de la conexión, se consumen demasiados recursos.
    El proceso de conexión TCP puede ser análogo a:
    Cliente: Soy Zhang San, ¿quién es usted?
    Servidor: Sé que eres Zhang San y yo soy Li Si.
    Cliente: Sé que sabes que yo soy Zhang San y tú eres Li Si.
    Por el contrario, el protocolo TCP es garantizar la transmisión de datos lo más completa posible, UDP es un método de conexión poco confiable, pero el protocolo UDP no es inútil, como la transmisión de video en red, para garantizar la fluidez del video tanto como sea posible, ocasionalmente pérdida de cuadros es aceptable, y el bombardeo de mensajes de spam generales también se basa en el protocolo UDP.

La diferencia entre webSocket y socket

https://www.cnblogs.com/Javi/p/9303020.html

Uso de socket basado en UDP

    @Test
    public void client() throws IOException {
    
    
        DatagramSocket datagramSocket = new DatagramSocket();
        String str = "这是基于UPD协议发送的文字";
        byte[] data = str.getBytes();
        InetAddress localHost = InetAddress.getLocalHost();
        DatagramPacket datagramPacket = new DatagramPacket(data, 0, data.length, localHost, 9000);
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    }
    
    @Test
    public  void server() throws IOException {
    
    
        DatagramSocket datagramSocket = new DatagramSocket(9000);
        byte[] buffer = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(buffer,0,buffer.length);
        datagramSocket.receive(datagramPacket);
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
    }
  • Aquí puede iniciar el cliente primero e iniciar el servidor, y no se informará ningún error, porque UDP es un protocolo que no necesita establecer una conexión confiable.

Supongo que te gusta

Origin blog.csdn.net/weixin_43941676/article/details/108434698
Recomendado
Clasificación