Maison  >  Article  >  Java  >  Pratique de la programmation réseau de la technologie sous-jacente Java : comment implémenter la communication Socket et NIO

Pratique de la programmation réseau de la technologie sous-jacente Java : comment implémenter la communication Socket et NIO

PHPz
PHPzoriginal
2023-11-08 17:54:59852parcourir

Pratique de la programmation réseau de la technologie sous-jacente Java : comment implémenter la communication Socket et NIO

Pratique de programmation réseau avec la technologie sous-jacente Java : Comment implémenter la communication Socket et NIO

1. Introduction

Avec le développement rapide d'Internet, la programmation réseau devient de plus en plus importante dans le développement de logiciels modernes. En tant que langage largement utilisé dans la programmation réseau, Java fournit un support technique sous-jacent riche. Parmi eux, la communication Socket et NIO sont deux méthodes de programmation réseau courantes et importantes en Java. Cet article explique comment utiliser Java pour implémenter la communication Socket et NIO, et donne des exemples de code spécifiques.

2. Communication Socket

La communication Socket est une méthode de programmation réseau basée sur le protocole de couche transport. Elle établit une connexion de communication entre le client et le serveur via des sockets (Socket). Java fournit les classes Socket et ServerSocket dans le package java.net pour implémenter la communication Socket.

  1. Exemple de code côté client
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try {
            // 创建Socket对象,并指定服务器的IP地址和端口号
            Socket socket = new Socket("127.0.0.1", 8888);
            
            // 获取输出流,用于向服务器发送数据
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);
            
            // 向服务器发送数据
            pw.write("Hello, Server!");
            pw.flush();
            
            // 关闭输出流和Socket连接
            pw.close();
            os.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. Exemple de code côté serveur
import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) {
        try {
            // 创建ServerSocket对象,并指定监听的端口号
            ServerSocket serverSocket = new ServerSocket(8888);
            
            // 等待客户端连接
            Socket socket = serverSocket.accept();
            
            // 获取输入流,用于接收客户端发送的数据
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            
            // 接收客户端发送的数据
            System.out.println("Received from client: " + br.readLine());
            
            // 关闭输入流、Socket连接和ServerSocket连接
            br.close();
            is.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3 NIO

NIO (New I/O) est une fonctionnalité d'E/S non bloquantes en Java qui utilise moins de threads. Implémentez une programmation réseau à haute concurrence. Java fournit Channel, Buffer, Selector et d'autres classes dans le package java.nio pour implémenter NIO.

  1. Exemple de code côté client
import java.io.*;
import java.nio.*;
import java.nio.channels.*;

public class Client {
    public static void main(String[] args) {
        try {
            // 创建SocketChannel对象,并连接服务器
            SocketChannel socketChannel = SocketChannel.open();
            socketChannel.connect(new InetSocketAddress("127.0.0.1", 8888));
            
            // 发送数据给服务器
            String message = "Hello, Server!";
            ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
            socketChannel.write(buffer);

            // 关闭SocketChannel连接
            socketChannel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. Exemple de code côté serveur
import java.io.*;
import java.nio.*;
import java.nio.channels.*;

public class Server {
    public static void main(String[] args) {
        try {
            // 创建ServerSocketChannel对象,并绑定监听的端口号
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.bind(new InetSocketAddress(8888));
            
            // 设置为非阻塞模式
            serverSocketChannel.configureBlocking(false);

            // 创建Selector对象,并将ServerSocketChannel注册到Selector上
            Selector selector = Selector.open();
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
            
            while (true) {
                // 阻塞式等待就绪的事件
                selector.select();
                
                // 获取就绪的事件集合
                Set<SelectionKey> selectedKeys = selector.selectedKeys();
                Iterator<SelectionKey> iterator = selectedKeys.iterator();
                
                // 处理就绪事件
                while (iterator.hasNext()) {
                    SelectionKey key = iterator.next();
                    
                    // 接收客户端连接请求
                    if (key.isAcceptable()) {
                        ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
                        SocketChannel socketChannel = serverChannel.accept();
                        
                        // 设置为非阻塞模式
                        socketChannel.configureBlocking(false);
                        
                        // 注册读事件到Selector上
                        socketChannel.register(selector, SelectionKey.OP_READ);
                    }
                    
                    // 读取客户端发送的数据
                    if (key.isReadable()) {
                        SocketChannel socketChannel = (SocketChannel) key.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(1024);

                        // 读取数据到缓冲区
                        int bytesRead = socketChannel.read(buffer);
                        if (bytesRead > 0) {
                            buffer.flip();

                            // 提取缓冲区中的数据
                            byte[] data = new byte[bytesRead];
                            buffer.get(data);
                            String message = new String(data);
                            System.out.println("Received from client: " + message);
                        }

                        // 关闭客户端连接
                        socketChannel.close();
                    }

                    // 从处理集合中移除当前就绪的事件
                    iterator.remove();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Résumé

Cet article présente la communication Socket et NIO dans la technologie sous-jacente de Java et donne des exemples de code spécifiques. Grâce à ces exemples, nous pouvons apprendre à utiliser Java pour la programmation réseau et comprendre les principes de base et l'utilisation de la communication Socket et de NIO. Dans le développement réel, le choix de la méthode de programmation réseau appropriée en fonction des besoins spécifiques peut améliorer les performances et les capacités de traitement simultané du programme. J'espère que les lecteurs pourront mieux comprendre et appliquer la technologie de programmation réseau sous-jacente de Java grâce au contenu de cet article.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn