如何在没有localhost地址的情况下创建ServerSocket对象

时间:2017-02-06 13:35:00

标签: java sockets networking server serversocket

Hy家伙,我在这里创建一个简单服务器的代码可以正常使用本地主机地址(127.0.0.1)。这是我的代码。

import java.io.*;
import java.net.*;
public class Main {

    public static void main(String[] args)
    {
        Zig z = new Zig();
        z.start();
    }
}
class Zig
{
    ServerSocket ss = null;
    InetAddress ia = null;
    Socket s = null;
    private static final int prt = 56540;
    Zig()
    {
        try
        {
            byte[] addr = {127,0,0,1};
            ia = InetAddress.getByAddress(addr);
            SocketAddress sa = new InetSocketAddress(ia,prt);
            ss = new ServerSocket();
            ss.bind(sa);
            s = ss.accept();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    Zig start()
    {
        try
        {
            InputStream i = s.getInputStream();
            InputStreamReader isr = new InputStreamReader(i);
            BufferedReader br = new BufferedReader(isr);
            String str = null;
            while (str != "stp")
            {
                str = br.readLine();
                System.out.println(str);

            }
            br.close();
            isr.close();
            i.close();
            s.close();
            ss.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return this;
    }
}

我的问题是,如何使用路由器的IP-192.168.8.1而不是127.0.0.1?我还尝试了http://whatsmyip.org的IP地址,但仍然遇到了这个例外:

java.net.BindException: Cannot assign requested address: JVM_Bind
    at java.net.DualStackPlainSocketImpl.bind0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
    at java.net.ServerSocket.bind(ServerSocket.java:375)
    at java.net.ServerSocket.bind(ServerSocket.java:329)
    at Zig.<init>(Main.java:26)
    at Main.main(Main.java:8)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Exception in thread "main" java.lang.NullPointerException
    at Zig.start(Main.java:38)
    at Main.main(Main.java:9)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

我想创建一个简单的服务器,我可以使用另一台具有互联网连接的计算机远程访问。 或者有没有办法通过互联网在两台计算机之间进行通信?

问候。

2 个答案:

答案 0 :(得分:0)

  
    

如何使用路由器的IP-192.168.8.1

  

您无法使用路由器的IP。您应该使用系统中可用的IP。

请注意此错误:

> java.net.BindException: Cannot assign requested address: JVM_Bind

bind失败,因为地址不是系统的地址。

答案 1 :(得分:0)

如果您希望2台设备通过LAN(本地网络)进行通信,您可以使用路由器分配给这些设备的地址(即您提到的192.168.8.X地址。编辑:正如Prabhu所提到的,使用设备IP地址,而不是路由器IP地址!您通常可以在路由器管理界面中找到路由器分配给连接设备的IP。请记住,您的路由器将来可能会为同一设备分配不同的地址。大多数路由器都具有始终为特定设备分配相同IP的功能。而且,出于安全原因,一些路由器阻止本地设备之间的通信(即,在有线和WiFi之间)。检查路由器的配置以获取更多信息和配置选项!

如果您希望您的设备通过互联网连接,您必须使用您的路由器全局IP地址(这可能是您使用whatsmyip发现的那个)。

此外,出于安全原因,您的路由器通常只会阻止来自互联网的传入请求。同样,您的路由器可能有一个名为端口转发的功能,它允许您将请求重定向到本地网络中的特定设备(以及该设备上的特定端口)。请谨慎使用,因为这会打开路由器内置安全机制(部分)。

最后,根据您的提供商,您可能拥有与其他客户共享的IPv4地址(请参阅Wikipedia)(所谓的DS-Lite(Wiki)。在这种情况下,您'无法从IPv4-internet访问网络,您唯一的机会是使用IPv6协议(如果可用)。

希望有所帮助。