web-dev-qa-db-fra.com

java.net.BindException: autorisation refusée lors de la création d'un ServerSocket sous Mac OSX

J'ai essayé d'exécuter un socket Java sous mac avec Eclipse mais cela ne fonctionne pas. J'ai eu cette erreur: 

Exception in thread "main" Java.net.BindException: Permission denied

    at Java.net.PlainSocketImpl.socketBind(Native Method)
    at Java.net.PlainSocketImpl.socketBind(PlainSocketImpl.Java:521)
    at Java.net.PlainSocketImpl.bind(PlainSocketImpl.Java:414)
    at Java.net.ServerSocket.bind(ServerSocket.Java:326)
    at Java.net.ServerSocket.<init>(ServerSocket.Java:192)
    at Java.net.ServerSocket.<init>(ServerSocket.Java:104)
    at server.MessageServer.main(MessageServer.Java:11)

Comment puis-je le faire fonctionner?

package server; //ChatServer 
import Java.io.*; 
import Java.net.*; 

public class MessageServer { 

public static void main (String args[]) throws IOException { 
    int port = 100; 
    ServerSocket server = new ServerSocket (port); 
    System.out.println("Server is started!"); 

    while (true) { 
        Socket client = server.accept (); 
        System.out.println ("Accepted from " + client.getInetAddress ()); 
        MessageHandler handler = new MessageHandler (client); 
        handler.start(); 
        } 
    } 
}
21
Kevbear

Vous ne pouvez pas ouvrir un port inférieur à 1024, si vous n'avez pas les privilèges root et que, d'après le code que vous avez posté dans votre commentaire, vous tentez d'ouvrir le port 100, ce qui confirme ma théorie.

Vous devez utiliser un port supérieur à 1024 si vous exécutez le code sous un utilisateur non root.

52
carlspring

Les systèmes Unix déclarent les ports <1024 comme "privilégiés" et vous avez besoin de droits d'administrateur pour démarrer un serveur.

Pour le test, utilisez un numéro de port> = 1024.

Lors du déploiement du serveur en production, exécutez-le avec les droits d'administrateur.

17
Aaron Digulla

J'ai eu le même problème et mes numéros de port étaient inférieurs à 1024, le changement de numéro de port supérieur à 1024 a résolu mon problème. Les ports inférieurs à 1024 sont appelés ports privilégiés et sous Linux (et la plupart des systèmes UNIX et des systèmes de type UNIX), aucun utilisateur non root ne peut les ouvrir.

2
confused

MyServer.Java

import Java.io.*;
import Java.net.*;
public class MyServer
{
    ServerSocket ss;
    Socket s;
    DataOutputStream dos;
    DataInputStream dis;
    public MyServer()
    {
        try 
        {
        System.out.println("Server Started ");
        ss=new ServerSocket(4444);
        s=ss.accept();
        System.out.println(s);
        System.out.println("Client Connected");
        dis=new DataInputStream(s.getInputStream());
        dos=new DataOutputStream(s.getOutputStream());
        ServerChat();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }   
    public static void main(String arg[])
    {
        new MyServer();
    }
    public void ServerChat()throws IOException
    {

        String str;
        do
        {
        str=dis.readUTF();
        System.out.println("Client msg : "+str);
        dos.writeUTF("Hello "+str);
        dos.flush();
        }while(!str.equals("stop"));

    }

}

MyClient.Java

import Java.io.*;
import Java.net.*;
public class MyClient
{
    Socket s;
    DataInputStream din;
    DataOutputStream dout;
    public MyClient()
    {
    try
    {
        s=new Socket("localhost",4444);
        System.out.println(s);
        din = new DataInputStream(s.getInputStream());
        dout = new DataOutputStream(s.getOutputStream());
        ClientChat();
    }
    catch(Exception e)
    {
    System.out.println(e);  
    }   
    }
    public void ClientChat() throws IOException
    {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String s1;
    do
    {
    s1=br.readLine();
    dout.writeUTF(s1);
    dout.flush();
    System.out.println("Server Msg : "+din.readUTF());
    }while(!s1.equals("stop"));
    }
    public static void main(String arg[])
    {
    new MyClient();
    }

}
0
JVD