Maison > Java > javaDidacticiel > Programmation réseau Java de superficielle à profonde 2 Introduction détaillée à la construction de Socket et aux exceptions associées pour la connexion au serveur

Programmation réseau Java de superficielle à profonde 2 Introduction détaillée à la construction de Socket et aux exceptions associées pour la connexion au serveur

黄舟
Libérer: 2017-03-04 10:07:33
original
1690 Les gens l'ont consulté

Méthode de construction de socket et paramètres et exceptions de socket

Cet article présentera la méthode de construction de socket, les paramètres d'attributs liés au socket et la gestion des exceptions

  • Construct Socket

  • Définir le délai d'attente

  • Définir l'adresse du serveur

  • Définir l'adresse du client

  • Le client se connecte au serveur Exceptions possibles


Construction Socket

La méthode de construction de Socket a les méthodes de surcharge suivantes :

Socket();Socket(InetAddress address, int port)Socket(InetAddress address, int port, 
InetAddress localAddr, int localPort)Socket(Proxy proxy)Socket(SocketImpl impl)Socket(String host, int port)
Socket(String host, int port, InetAddress localAddr, int localPort)
Copier après la connexion

À l'exception du premier constructeur, tous les autres constructeurs tenteront d'établir une connexion avec le serveur. Si la connexion réussit, un objet Socket sera renvoyé ; si la connexion échoue pour une raison quelconque, une IOException sera levée.
Le code suivant analyse les ports de 1 à 1024 sur l'hôte pour déterminer si ces ports ont été surveillés par le programme serveur.

public class PortScanner {    public static void main(String[] args) {
        String host = "localhost";        new PortScanner().scan(host);
    }    public void scan(String host){
        Socket socket = null;        for(int i=0;i<1024;i++){            try {
                socket = new Socket(host, i);
                System.out.println("There is a server on port "+i);
            }  catch (IOException e) {
                System.out.println("Can&#39;t connect to port "+i);
            }finally{                if(socket!=null){                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
Copier après la connexion

Définissez le délai d'attente d'établissement de la connexion

Utilisez le constructeur sans paramètres pour définir le délai d'attente de connexion au socket :

Socket socket = new Socket();
SocketAddress endPoint = new InetSocketAddress("localhost", 8000);socket.connect(endPoint, 60000);
Copier après la connexion

Le code ci-dessus indique qu'il est utilisé pour se connecter au port 8000 surveillé sur cette machine. Le temps maximum d'attente pour la connexion est de 1 minute. Si la connexion réussit dans la minute, la méthode connect() renvoie un résultat réussi ; si une exception se produit dans la minute, une exception sera levée si plus d'une minute s'est écoulée, ni la connexion n'est réussie ni aucune exception n'est levée ; alors une exception sera levée SocketTimeoutException. socket. connect(SocketAddress endpoint, int timeout); Responsable de la connexion au serveur, le paramètre endpoint spécifie l'adresse du serveur et le paramètre timeout définit le délai d'expiration en millisecondes. Si le paramètre timeout est 0, cela signifie qu'il n'expirera jamais.

Définir l'adresse du serveur

Parmi les méthodes de construction de Socket, à l'exception de la première méthode de construction sans paramètres, d'autres méthodes de construction doivent spécifier l'adresse du serveur, y compris celle du serveur IP ou nom d'hôte et port :
Socket (adresse InetAddress, port int)
Socket (hôte String, port int)
La classe InetAddress représente l'adresse IP du serveur InetAddress fournit de nombreuses méthodes statiques :

    // 返回本地主机的IP地址
    InetAddress.getLocalHost();    // 返回代表10.202.164.65的IP地址
    InetAddress.getByName("10.202.164.65");    // 返回域名为&#39;www.csdn.net&#39;的ip地址
    InetAddress.getByName("www.csdn.net");
Copier après la connexion

Définissez l'adresse du client :

Par défaut, l'adresse IP du client provient de l'hôte où se trouve le programme client, et le port du client est aléatoire attribué par le système d'exploitation. Cependant, la classe Socket fournit toujours un constructeur qui vous permet de définir explicitement l'adresse IP et le port du client :

//参数localAddr和localPort用来设置客户端的IP和端口。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
Socket(String host, int port, InetAddress localAddr, int localPort)
Copier après la connexion

Exceptions pouvant être levées par le client lors de la connexion au serveur

Lorsque Lorsque la méthode de construction Socket demande de se connecter au serveur, l'exception suivante peut être levée :
• UnknownHostException : si le nom ou l'adresse IP de l'hôte ne peut pas être reconnu, cette exception sera levée

• ConnectException : s'il n'y en a pas, cette exception sera levée lorsque le processus serveur écoute sur le port spécifié ou que le serveur refuse la connexion.

• SocketTimeoutException : cette exception sera levée si le délai d'attente de la connexion expire.

• BindException : cette exception sera levée si l'objet Socket ne peut pas être lié à l'adresse IP ou au port local spécifié.

Prenez la classe de test suivante comme exemple pour démontrer la raison de la levée d'une exception.

public class ConnectTester {    public static void main(String[] args) {
        String host = "www.csdn.net";        
        int port = 12312;        
        new ConnectTester().connect(host, port);
    }    public void connect(String host,int port){
        SocketAddress remoteAddress = new InetSocketAddress(host, port);
        Socket socket = null;
        String result = null;        
        try{
            socket = new Socket();            
            long start = System.currentTimeMillis();
            socket.connect(remoteAddress,1000);            
            long end = System.currentTimeMillis();
            result = (end-start)+"ms";
        }catch(BindException bindException){
            result = "BindException,Socket对象与指定的本地IP地址或端口绑定,异常";
        }catch (UnknownHostException unknownHostException) {
            result = "UnknownHostException,无法识别的主机";
        }catch (ConnectException connectException) {
            result = "ConnectException,连接被拒绝";
        }catch (SocketTimeoutException socketTimeoutException) {
            result = "SocketTimeoutException,连接超时";
        }catch(IOException e){
            result = "IOException,连接失败";
        }finally{            if(socket!=null){                
        try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println(remoteAddress+" : "+result);
    }
}
Copier après la connexion

• Lancement d'une exception UnknownHostException :
Cette exception sera levée si le nom ou l'adresse IP de l'hôte ne peut pas être reconnu. Par exemple : l'hôte est : 'somehost11'. La méthode connect du Socket lancera une UnknownHostException.
• Situations dans lesquelles ConnectException est levée :
ConnectException sera levée dans les deux situations suivantes.
1) Aucun processus serveur n'écoute sur le port spécifié. Par exemple : l'hôte est « localhost » et le port est 12321. Si le port local 12321 n’est surveillé par aucun processus, la méthode de connexion Socket lancera ConnectException.
2) Le processus serveur a refusé la connexion. Présente la situation dans laquelle le processus serveur rejette la demande de connexion du client. Comme le montre l'exemple de code suivant, le deuxième paramètre de la méthode de construction d'un programme de service simple ServerSocket représente la longueur de la file d'attente des requêtes. Si la file d'attente est pleine de requêtes, le serveur rejette les requêtes restantes. Lancer ConnectException

public class SimplServer {    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8888, 2);
        Thread.sleep(3600000);
    }
}
Copier après la connexion
public class SimpleClient {    
public static void main(String[] args) throws Exception{
        String host = "localhost";        int port = 8888;
        Socket s1 = new Socket(host, port);
        System.out.println("第一次连接成功");
        Socket s2 = new Socket(host, port);
        System.out.println("第二次连接成功");
        Socket s3 = new Socket(host, port);
        System.out.println("第三次连接成功");
    }
}
Copier après la connexion

• Situations dans lesquelles SocketTimeoutException est levée
Cette exception sera levée si la connexion client expire. Modification                                                                                                                                                                                 Modifié des 1 000 millisecondes d'origine à 1 milliseconde, ce qui augmente le risque d'expiration. socket.connect(remoteAddress, 1);

• Situation où BindException est levée :

Modifiez le code

socket = new Socket();socket.connect(remoteAddress, 1000);
Copier après la connexion
en :

socket = new Socket();
socket.bind(new InetSocketAddress(InetAddress.getByName("222.34.5.6"), 5678));
socket.connect(remoteAddress, 1000);
Copier après la connexion
Le code modifié tente de changer l'adresse IP locale de le Socket Réglez-le sur 222.34.5.6 et définissez le port local sur 5678. Si cette machine n'a pas l'adresse IP ou si le port est occupé, une BindException se produira.

Ce qui précède est une introduction détaillée à la programmation réseau Java, de la plus superficielle à la plus profonde, à la construction de sockets et aux exceptions associées se connectant au serveur. Pour plus de contenu connexe, veuillez prêter attention au site Web PHP chinois (www.php.cn). )!



Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal