Maison Java javaDidacticiel Partage d'exemples de programmation Socket en Java (image)

Partage d'exemples de programmation Socket en Java (image)

May 28, 2017 am 09:20 AM
java socket 编程

Socket est très pratique pour nous. Vous trouverez ci-dessous les notes de cette étude. Il est principalement divisé en types d'exceptions, principes d'interaction, Socket, ServerSocket et multi-threading

Pour les applications en temps réel ou les jeux en temps réel, le protocole HTTP ne peut souvent pas répondre à nos besoins. En ce moment, Socket est très pratique pour nous. Vous trouverez ci-dessous les notes de cette étude. Il est principalement expliqué en termes de types d'exceptions, de principes d'interaction, de Socket, de ServerSocket et de multi-threading.

Types d'exceptions

Avant de comprendre le contenu de Socket, vous devez d'abord comprendre certains des types d'exceptions impliqués. Les quatre types suivants héritent tous de IOException, donc beaucoup d'entre eux peuvent afficher directement IOException.

UnkownHostException :  Nom d'hôte ou erreur IP
ConnectException :  Le serveur a refusé la connexion, le serveur n'a pas démarré, (le nombre de files d'attente a été dépassé, la connexion a été refusée)
SocketTimeoutException : La connexion a expiré
BindException :   L'objet Socket ne peut pas être connecté à l'adresse IP locale ou à la liaison de port spécifiée

Processus d'interaction

Interaction entre Socket et ServerSocket, je pense que l'image suivante a été très détaillée et claire.

Constructeur de socket

Socket()
Socket(Adresse InetAddress, int port) lève UnknownHostException, IOException
Socket (adresse InetAddress, port int, InetAddress localAddress, int localPort) lève IOException
Socket (hôte de chaîne, port int) lève UnknownHostException, IOException
Socket (hôte de chaîne, port int , InetAddress localAddress, int localPort)lance IOException

Sauf pour le premier sans paramètres, d'autres constructeurs tenteront d'établir une connexion avec le serveur. En cas d'échec, une erreur IOException sera générée. En cas de succès, l'objet Socket est renvoyé.

InetAddress est une classe utilisée pour enregistrer les hôtes. Son getHostByName(String msg) statique peut renvoyer une instance. Sa méthode statique getLocalHost() peut également obtenir l'adresse IP de l'hôte actuel et renvoyer une instance. Les paramètres du constructeur Socket(String host, int port, InetAddress localAddress, int localPort) sont respectivement l'adresse IP cible, le port cible, l'adresse IP locale liée et le port local lié.

Méthode Socket

getInetAddress(); L'adresse IP du serveur distant
getPort(); le serveur distant
getLocalAddress()  L'adresse IP du client local
getLocalPort()  Le port du client local
getInputStream();  Récupère le flux d'entrée
getOutStream(); Obtenez le flux de sortie

Il convient de noter que, parmi ces méthodes, les plus importantes sont getInputStream() et getOutputStream().

Statut du socket

isClosed(); //Si la connexion est fermée, si elle est fermée, renvoie true sinon renvoie false ;
isConnect(); //S'il a déjà été connecté, retournez true ; sinon, retournez false
isBound(); //Si le Socket a été lié à un port local, retournez true ; sinon, retournez false

Si vous souhaitez confirmer si l'état du Socket est connecté, la déclaration suivante est un bon moyen de juger.

boolean isConnection=socket.isConnected() && !socket.isClosed(); // Détermine si la connexion est actuellement connectée

Fermez à moitié le Socket

Souvent, nous ne savons pas combien de temps il faudra pour lire le flux d'entrée obtenu avant qu'il ne se termine. Voici quelques-unes des méthodes les plus courantes :

  •  Identifiant personnalisé (comme dans l'exemple ci-dessous, lors de la réception de la chaîne "bye", fermez le Socket)

  •  Informer la longueur de lecture (pour certains protocoles personnalisés, les premiers octets sont fixes pour indiquer la longueur de lecture)

  •  Lire toutes les données

  •  Lorsque le Socket est fermé lors de l'appel de close, fermez ses flux d'entrée et de sortie

Constructeur ServerSocket


ServerSocket()throws IOException
ServerSocket(int port)throws IOException
ServerSocket(int port, int backlog)throws IOException
ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException
Copier après la connexion

Remarque :

1. par le serveur de port ; la longueur de la file d'attente de la demande de connexion du client en retard ; IP de liaison du serveur bindAddr

2 Si le port est occupé ou n'a pas l'autorisation d'utiliser certains ports, une erreur BindException sera générée. Par exemple, les ports 1 à 1023 nécessitent que les administrateurs aient l'autorisation de se lier.

3. Si le port est réglé sur 0, le système lui attribuera automatiquement un port

4. bindAddr用于绑定服务器IP,为什么会有这样的设置呢,譬如有些机器有多个网卡。

5. ServerSocket一旦绑定了监听端口,就无法更改。ServerSocket()可以实现在绑定端口前设置其他的参数。

单线程的ServerSocket例子


public void service(){
  while(true){
    Socket socket=null;
    try{
      socket=serverSocket.accept();//从连接队列中取出一个连接,如果没有则等待
      System.out.println("新增连接:"+socket.getInetAddress()+":"+socket.getPort());
      ...//接收和发送数据
    }catch(IOException e){e.printStackTrace();}finally{
      try{
        if(socket!=null) socket.close();//与一个客户端通信结束后,要关闭Socket
      }catch(IOException e){e.printStackTrace();}
    }
  }
}
Copier après la connexion

多线程的ServerSocket

多线程的好处不用多说,而且大多数的场景都是多线程的,无论是我们的即时类游戏还是IM,多线程的需求都是必须的。下面说说实现方式:

  •  主线程会循环执行ServerSocket.accept();

  •  当拿到客户端连接请求的时候,就会将Socket对象传递给多线程,让多线程去执行具体的操作;

实现多线程的方法要么继承Thread类,要么实现Runnable接口。当然也可以使用线程池,但实现的本质都是差不多的。

这里举例:

下面代码为服务器的主线程。为每个客户分配一个工作线程:


public void service(){
  while(true){
    Socket socket=null;
    try{
      socket=serverSocket.accept();            //主线程获取客户端连接
      Thread workThread=new Thread(new Handler(socket));  //创建线程
      workThread.start();                  //启动线程
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}
Copier après la connexion

当然这里的重点在于如何实现Handler这个类。Handler需要实现Runnable接口:


class Handler implements Runnable{
  private Socket socket;
  public Handler(Socket socket){
    this.socket=socket;
  }
  
  public void run(){
    try{
      System.out.println("新连接:"+socket.getInetAddress()+":"+socket.getPort());
      Thread.sleep(10000);
    }catch(Exception e){e.printStackTrace();}finally{
      try{
        System.out.println("关闭连接:"+socket.getInetAddress()+":"+socket.getPort());
        if(socket!=null)socket.close();
      }catch(IOException e){
        e.printStackTrace();
      }
    }
  }
}
Copier après la connexion

当然是先多线程还有其它的方式,譬如线程池,或者JVM自带的线程池都可以。这里就不说明了。

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 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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Oct 11, 2024 pm 08:58 PM

Python permet aux débutants de résoudre des problèmes. Sa syntaxe conviviale, sa bibliothèque complète et ses fonctionnalités telles que les variables, les instructions conditionnelles et les boucles permettent un développement de code efficace. De la gestion des données au contrôle du flux du programme et à l'exécution de tâches répétitives, Python fournit

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

La clé du codage : libérer la puissance de Python pour les débutants La clé du codage : libérer la puissance de Python pour les débutants Oct 11, 2024 pm 12:17 PM

Python est un langage d'introduction à la programmation idéal pour les débutants grâce à sa facilité d'apprentissage et ses fonctionnalités puissantes. Ses bases incluent : Variables : utilisées pour stocker des données (nombres, chaînes, listes, etc.). Type de données : Définit le type de données dans la variable (entier, virgule flottante, etc.). Opérateurs : utilisés pour les opérations mathématiques et les comparaisons. Flux de contrôle : contrôlez le flux d'exécution du code (instructions conditionnelles, boucles).

Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Oct 11, 2024 pm 10:47 PM

C est un choix idéal pour les débutants qui souhaitent apprendre la programmation système. Il contient les composants suivants : fichiers d'en-tête, fonctions et fonctions principales. Un simple programme C capable d'imprimer "HelloWorld" a besoin d'un fichier d'en-tête contenant la déclaration de fonction d'entrée/sortie standard et utilise la fonction printf dans la fonction principale pour imprimer. Les programmes C peuvent être compilés et exécutés à l'aide du compilateur GCC. Après avoir maîtrisé les bases, vous pouvez passer à des sujets tels que les types de données, les fonctions, les tableaux et la gestion des fichiers pour devenir un programmeur C compétent.

Libérez votre programmeur intérieur : C pour les débutants absolus Libérez votre programmeur intérieur : C pour les débutants absolus Oct 11, 2024 pm 03:50 PM

C est un langage idéal pour les débutants qui souhaitent apprendre la programmation, et ses avantages incluent l'efficacité, la polyvalence et la portabilité. L'apprentissage du langage C nécessite : Installer un compilateur C (tel que MinGW ou Cygwin) Comprendre les variables, les types de données, les instructions conditionnelles et les instructions de boucle Ecrire le premier programme contenant la fonction principale et la fonction printf() S'entraîner à travers des cas pratiques (comme le calcul de moyennes) Connaissance du langage C

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles