我试图用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();
}
}
}
答案 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();
}
}