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();
}
}
}
Ответы
Ответ 1
Вы не можете открыть порт ниже 1024, если у вас нет привилегий root и из кода, опубликованного в вашем комментарии, вы, похоже, пытаетесь открыть порт 100
, который подтверждает мою теорию.
Вам нужно использовать порт, который превышает 1024, если вы используете код под пользователем без полномочий root.
Ответ 2
Системы на основе Unix объявляют порты < 1024 в качестве "привилегированного", и вам необходимо получить права администратора для запуска сервера.
Для тестирования используйте номер портa >= 1024.
При развертывании сервера в процессе производства запустите его с правами администратора.
Ответ 3
У меня была та же проблема, и мои номера портов были ниже 1024, изменение номера порта на более 1024 решило мою проблему. Порты ниже 1024 называются Привилегированными портами, а в Linux (и в большинстве разновидностей UNIX и UNIX-подобных системах) им не разрешено открываться любым пользователем без полномочий root.
Ответ 4
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();
}
}