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
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)
À 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't connect to port "+i); }finally{ if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } }
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);
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.
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"); // 返回域名为'www.csdn.net'的ip地址 InetAddress.getByName("www.csdn.net");
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)
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); } }
• 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); } }
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("第三次连接成功"); } }
• 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);
Modifiez le code
socket = new Socket();socket.connect(remoteAddress, 1000);
socket = new Socket(); socket.bind(new InetSocketAddress(InetAddress.getByName("222.34.5.6"), 5678)); socket.connect(remoteAddress, 1000);