有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建没有本地主机地址的ServerSocket对象

各位,我在这里创建一个简单服务器的代码与本地主机地址(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)

我想创建一个简单的服务器,我可以远程访问与另一台计算机都有互联网连接。 或者有没有一种方法可以让两台计算机通过互联网进行通信

问候


共 (1) 个答案

  1. # 1 楼答案

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

    如果你想让你的设备通过互联网连接,你必须使用你的路由器的全球IP地址(这可能就是你用whatsmyip找到的地址)

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

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

    希望有帮助