Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定传入连接来自本地计算机_Java_Networking_Sockets_Network Programming - Fatal编程技术网

Java 如何确定传入连接来自本地计算机

Java 如何确定传入连接来自本地计算机,java,networking,sockets,network-programming,Java,Networking,Sockets,Network Programming,我有一个接受传入连接的SocketServer。出于安全原因,我应该只允许本地连接(来自运行服务器的机器的连接) 如何确定传入连接是否来自另一台机器?以下代码对此安全吗 Socket socket = someServerSocket.accept(); String remoteAddress = socket .getInetAddress().getHostAddress(); if (!fromThisMachine(remoteAddress)) { // Not from t

我有一个接受传入连接的SocketServer。出于安全原因,我应该只允许本地连接(来自运行服务器的机器的连接)

如何确定传入连接是否来自另一台机器?以下代码对此安全吗

Socket socket = someServerSocket.accept();
String remoteAddress = socket .getInetAddress().getHostAddress();
if (!fromThisMachine(remoteAddress)) {
    // Not from this machine.
}
fromThisMachine()
方法如下:

public boolean fromThisMachine(String remoteAddress) {
    try {
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        while (interfaces.hasMoreElements()) {
            NetworkInterface networkInterface = interfaces.nextElement();
            Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
            while (addresses.hasMoreElements()) {
                InetAddress inetAddress = addresses.nextElement();
                String hostName = inetAddress.getHostName();
                String hostAddr = inetAddress.getHostAddress();
                if (hostName.equals(remoteAddress) || hostAddr.equals(remoteAddress)) {
                    return true;
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    log("Unauthorized request to server from: " + remoteAddress);
    return false;
}
thismachine的公共布尔值(字符串remoteAddress){
试一试{
枚举接口=NetworkInterface.getNetworkInterfaces();
while(interfaces.hasMoreElements()){
NetworkInterface NetworkInterface=interfaces.nextElement();
枚举地址=networkInterface.getInetAddresses();
while(addresses.hasMoreElements()){
InetAddress InetAddress=地址.nextElement();
字符串hostName=inetAddress.getHostName();
字符串hostAddr=inetAddress.getHostAddress();
if(hostName.equals(remoteAddress)| hostAddr.equals(remoteAddress)){
返回true;
}
}
}
}捕获(例外e){
e、 printStackTrace();
返回false;
}
日志(“从:“+remoteAddress”向服务器发出的未经授权的请求);
返回false;
}
谢谢,
Mohsen

如果要限制来自本地主机的连接,请在打开ServerSocket时指定。如果只在localhost上侦听,则只能从localhost获取连接

    int port = .....
    SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port);
    ServerSocket serverSocket = new ServerSocket();
    serverSocket.bind(socketAddress);
    serverSocket.accept();

谢谢你,斯卡夫曼。下面的代码进行了一些操作(硬编码127.0.0.1)

如果我从InetAddress.getLocalHost()读取本地地址,则同一子网上的其他网络用户仍然可以看到我的服务器

Mohsen.

InetAddress.getByName(null)始终返回环回地址。见


它不起作用。请看:我在192.168.0.1上,其他人在192.168.0.2上。我想拒绝他在192.168.0.1:端口上监听我的服务器套接字,但这个解决方案不起作用。这只是导致从我自己的机器连接到127.0.0.1:端口无法工作。这不是问题的答案。为什么它的标记不正确。其他答案也是错误的,在这种情况下,它应该是开放的,没有回答所有其他人谁提出了同样的问题。哦,是的,我忘记了
inetades.getLocalHost()
没有给你127.0.0.1,它给出了该本地主机的外部IP地址。我的错。是的,我发现InetAddress.getLocalHost()也不能像预期的那样工作。请注意,“我正在监听127.0.0.1,因此只有本地用户可以连接到我”的假设有时会失败-例如,如果您的计算机上运行代理,可以强制其代表远程用户连接到127.0.0.1。很好。要是我早知道就好了。我感到非常困惑。这是功能爬行最糟糕的例子之一。提供
InetAddress.getLoopbackAddress()
会更干净。我只是偶然发现的。在某些情况下,我的应用程序中的地址字符串被置为空,而不是NPE,我的应用程序仍然单独发出嘎嘎声。这给我们上了一堂很有价值的课,让我们仔细阅读Java API并全神贯注。@AlexanderPogrebnyak,愚蠢的问题。。。“那怎么办?”吉利说。最初的问题是只接受本地主机的连接
isLoopbackAddress
不会帮助您获取本地主机IP地址。它会提供IP4或IP6协议的环回地址吗?请不要只写IP4代码。我们需要尽快转换到IP6。
int port = .....
SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port);
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(socketAddress);
serverSocket.accept();
    int port = .....
    SocketAddress socketAddress =
        new InetSocketAddress( InetAddress.getByName( null ), port);
    ServerSocket serverSocket = new ServerSocket();
    serverSocket.bind(socketAddress);
    serverSocket.accept();