java.net.BindException:在Mac OSX上创建ServerSocket时拒绝权限

时间:2014-08-28 09:04:08

标签: java macos sockets

我试图用eclipse在mac中运行Java套接字,但它不起作用。我收到了这个错误:

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(); 
        } 
    } 
}

5 个答案:

答案 0 :(得分:55)

您无法在1024以下打开一个端口,如果您没有root权限,并且您在评论中发布的代码中,您似乎正在尝试打开确认的端口100我的理论。

如果您在非root用户下运行代码,则需要使用高于1024的端口。

答案 1 :(得分:21)

Unix-based systems declare ports < 1024为“特权”,您需要管理员权限才能启动服务器。

要进行测试,请使用端口号&gt; = 1024。

在生产中部署服务器时,请使用管理员权限运行它。

答案 2 :(得分:2)

我遇到了同样的问题,我的端口号低于1024,将端口号更改为1024以上可以解决我的问题。低于1024的端口称为特权端口,在Linux(以及大多数UNIX和类似UNIX的系统)中,不允许任何非root用户打开它们。

答案 3 :(得分:1)

许多系统将小于1024的端口声明为“管理员权限”端口。这意味着,如果仅将其用于基本测试,则使用更高的端口(例如2000)。这将清除通过运行当前程序而获得的异常。

    int port = 100; 
    ServerSocket server = new ServerSocket (port); 

将其更改为诸如:

    int port = 2000; 
    ServerSocket server = new ServerSocket (port); 

答案 4 :(得分:0)

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();
    }

}