it-swarm.com.ru

java.net.BindException: в доступе отказано при создании ServerSocket на Mac OSX

Я пытался запустить сокет Java в Mac с Eclipse, но он не работает. Я получил эту ошибку: 

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)

Как я могу сделать это для запуска?

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

Вы не можете открыть порт ниже 1024, если у вас нет привилегий root и из кода, который вы разместили в своем комментарии, вы, кажется, пытаетесь открыть порт 100, который подтверждает мою теорию.

Вам нужно использовать порт, который больше 1024, если вы запускаете код от имени пользователя без полномочий root.

52
carlspring

Системы на основе Unix объявляют порты <1024 "привилегированными", и вам нужны права администратора для запуска сервера.

Для тестирования используйте номер порта> = 1024.

При развертывании сервера в рабочей среде запускайте его с правами администратора.

17
Aaron Digulla

У меня была та же проблема, и мои номера портов были ниже 1024, изменение номера порта на более 1024 решило мою проблему. Порты ниже 1024 называются Привилегированными портами, а в Linux (и в большинстве разновидностей UNIX и UNIX-подобных системах) им не разрешено открываться любым пользователем без полномочий root.

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