BindException: Adresse déjà en cours d'utilisation, même avec de port unique
J'ai posé cette question hier et personne n'a été en mesure de comprendre le problème que j'ai. J'ai donc été l'espoir de fournir un plus à jour de code avec les suggestions d'hier ajouté. En gros, j'ai essayé de créer une connexion entre un serveur et un client, mais chaque fois que j'ai exécuté le serveur puis le client, j'aimerais obtenir cette exception: Address already in use
. La réponse la plus évidente serait de lui donner un nouveau port, mais même alors, je reçois toujours ce message d'erreur. Je suis en supposant qu'il a quelque chose à faire avec mon code quelque part va mal. Quelqu'un peut-il repérer s'il vous plaît? J'ai joint le serveur de la classe et de la classe client.
C'est l'erreur que je reçois:
Exception in thread "main" java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
at java.net.ServerSocket.bind(ServerSocket.java:376)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
at MessageServer.main(MessageServer.java:16)
Code serveur:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
public class MessageServer {
public static void main(String[] args) throws IOException {
try {
int port = 53705;
ServerSocket server = new ServerSocket(port);
while (true) {
System.out.println("Waiting for client...");
//server.setReuseAddress(true);
Socket client = server.accept();
System.out.println("Client from " + server.getInetAddress() + " connected.");
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String inputLine = in.readLine();
System.out.println("Client said: '"+inputLine+"'");
Writer count = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
byte c [] = count.toString().getBytes();
count.flush();
count.close();
in.close();
}
} catch (IOException e) {
System.err.println(e);
}
}
}
Code Client:
import java.net.*;
import java.io.*;
public class MessageSendClient {
public static void man(String args[]) throws IOException {
String servername = "localhost";
int port = 53705;
Socket server;
//server.setReuseAddress(true);
try {
server = new Socket (servername,port);
System.out.println("Connected to " + server.getInetAddress());
DataInputStream in = new DataInputStream(new BufferedInputStream(server.getInputStream()));
server.close();
byte c[] = new byte[100];
int num = in.read(c);
String count = new String(c);
System.out.println("Server said: " + count);
} catch (Exception e) { }
}
}
SALUT, j'ai édité mon post avec la trace de la pile. Pouvez-vous voir où je vais mal avec mon code s'il vous plaît?
avez-vous résoudre ce problème ?
OriginalL'auteur user3576868 | 2014-04-27
Vous devez vous connecter pour publier un commentaire.
Vous obtenez le message d'erreur lorsque le programme serveur tente d'ouvrir un socket sur le port 53705 pour l'écoute. Le
Address already in use
message signifie simplement que, d'un autre processus sur votre machine est déjà en utilisant le port 53705. Il se pourrait que certains processus de démon a ouvert ce même port par coïncidence, ou de votre navigateur internet a ouvert ce port et est encore de l'utiliser.Plus probablement, cependant, est que vous avez une autre instance de votre serveur d'exécution du programme, quelque part dans le fond. Vérifiez tous vos terminaux windows, ou vérifier votre IDE pour les onglets contenant de l'état d'exécution des programmes.
Par la voie, "de port unique" est un peu trompeur, comme le port 53705 n'est pas "unique" de toute façon, il arrive juste à être un numéro de port que vous (ou quelqu'un) a remarqué que vous espère n'est pas déjà en cours d'utilisation. Pour obtenir un unique port, utilisez
new ServerSocket(0)
qui va demander au système d'allouer un port inutilisé. Pour savoir quel port est affecté, à l'utilisationserverSocket.getLocalPort()
. Vous pouvez l'imprimer, puis de le passer au programme client comme une option de ligne de commande.OriginalL'auteur Stuart Marks
Je pense que vous êtes en cours d'exécution dans un plattform et java liberary problème spécifique.
Veuillez fournir d'autres infos à propos de votre système d'exploitation plattform (x86/x64) et la version de jdk à partir de quelle marque utilisez-vous?
Selon ce Lien
http://www.oracle.com/technetwork/java/javase/7u51-relnotes-2085002.html
Ci-dessus Oracle JDK 7u51: par défaut, La prise autorisations attribuées à l'ensemble du code, y compris un code non fiable ont été modifiés. Vous ne pouvez lier les sockets à la plage de ports éphémères sur chaque système.
Port 53705 devrait enregistrer un port éphémère.
Mais toujours utiliser
pour vérifier si le port est utilisé dans linux et utiliser netstat ou tcpview pour windows.
Vous pouvez utiliser
pour linux pour vérifier votre plage de ports éphémères pour linux et trouver
dans windows pour obtenir de déterminer votre plage de ports éphémères. Plus sur la plage éphémère dans windows peut être trouvé dans comment modifier/afficher la plage de ports éphémères dans les machines windows
Je peux confirmer votre code serveur et client sans l ' "homme" -> "principal" de la faute de frappe est en cours d'exécution sous Opensuse 12.3 avec
merci pour vos commentaires, mais la nouvelle restriction est que la liaison sockets en dehors de la plage éphémère maintenant nécessite une autorisation explicite dans le système politique de sécurité, ce qui signifie que c'est un Paramètre supplémentaire à l'extérieur de ma programmation alors que l'Environnement des Configurations. Si je ne le faisais pas, je ne peux toujours pas lier les ports, je n'ai également obtenir une BindException causés par l'Exception de sécurité? ou je me trompe? Merci.
OriginalL'auteur Yingding Wang
J'ai testé ton code et il fonctionne correctement (ce qui signifie: je peux me connecter au serveur, n'est-ce pas tester le reste). Seulement prêter attention à la méthode main dans MessageSendClient, il y a une faute de frappe ("l'homme" au lieu de "main") et la signature correcte est:
pas
Assurez-vous que le port d'écoute est libre en cours d'exécution (remplacer YOUR_PORT avec le nombre)
parce que c'est la raison pour laquelle vous obtenez ce que l'exception. Si vous êtes sur Windows, vous pouvez simplement exécuter
et de recherche pour le port.
OriginalL'auteur Marco Chiappetta