java - 两个java流程实例之间的差异

标签 java ant firewall

我的 Windows 计算机上有一个 java TCP 服务器 TCPEchoServer,在远程 Linux 计算机上有一个客户端 TCPClient

当我从命令行启动TCPEchoServer时,一切正常。但是当我从 Ant 启动它时,客户端无法建立到我的服务器的连接。

当我关闭 Windows 防火墙时,在两种情况下(命令行和 Ant)一切都工作正常。我没有通过 ANT_OPTS 或命令行指定任何代理设置。

当我在本地启动 TCPClient 时,它在两种情况下都可以正确连接。

在 Java 配置面板中,我有“使用浏览器设置”选项。

我想知道如何检测从命令行启动的 java 进程实例和从 Ant 启动的 java 进程实例之间的差异。

我打印出了 env 和 java 系统属性。一切似乎都一样。我还可以打印什么来查看差异?

这里是java代码和Ant脚本。

服务器:

import java.net.*; 
import java.io.*; 
import java.util.*; 

public class TCPEchoServer extends Thread { 

    public static void main(String[] args) throws Exception { 


        for(String prop : System.getProperties().stringPropertyNames()) {
            System.out.println(prop + "=" + System.getProperties().getProperty(prop));
        }
        Map<String, String> env = System.getenv();
        for (String name : env.keySet()) {
            System.out.format("%s=%s%n", name, env.get(name));
        }

        ServerSocket serverSocket = null; 
        int port = -1;
        if(args.length < 1) {
            System.out.println("java TCPEchoServer port");
            System.exit(1);
        }
        port = new Integer(args[0]).intValue();

        serverSocket = new ServerSocket(port); 
        while(true) {
            final Socket socket = serverSocket.accept();
            new Thread() {
                public void run() {
                    try{
                        DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
                        String inputLine; 
                        while ((inputLine = in.readLine()) != null) { 
                            System.out.println("received:" + inputLine);
                            out.writeBytes(inputLine.toUpperCase() + "\n");
                        }
                    }
                    catch(Exception e) {
                        System.err.println("Exception:" + e.getMessage());
                    }
                }
            }.start(); 
        }

    }

} 

客户端

import java.net.*; 
import java.io.*; 
import java.util.*; 

public class TCPClient { 

    public static void detectProxy(String host, int port) {
        System.out.println("detecting proxies");
        List proxyList = null;
        try {
            proxyList = ProxySelector.getDefault().select(new URI("socket://" + host + ":" + port));
        } 
        catch (URISyntaxException e) {
            System.err.println(e.getMessage());
        }
        if (proxyList != null) {
            for (Object p : proxyList) {
                java.net.Proxy proxy = (java.net.Proxy)p;
                InetSocketAddress addr = (InetSocketAddress) proxy.address();
                System.out.println(proxy.type() + ((addr == null)? "No Proxy": "host:" + addr.getHostName() + ", port" + addr.getPort()));
            }
        }
    }

    public static void main(String[] args) throws Exception { 

        ServerSocket serverSocket = null; 
        int port = -1;
        if(args.length < 2) {
            System.out.println("java TCPClient host port");
            System.exit(1);
        }
        port = new Integer(args[1]).intValue();
        detectProxy(args[0], port);

        Socket socket = new Socket(args[0], port);
        DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        out.writeBytes("Hi there!\n");
        System.out.println("got back:" + in.readLine());
        socket.close();
    }

} 

Ant 脚本

<project name="server" default="run">
    <target name="run" >
        <java fork="true" spawn="false" classname="TCPEchoServer" >
            <arg value="4444" />
            <classpath>
                <pathelement location="." />
            </classpath>
        </java>
    </target>
</project>

最佳答案

最后,解决方案是为所有 java 平台二进制文件启用防火墙

enter image description here

关于java - 两个java流程实例之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25325579/

相关文章:

ant - 在 Hybris 中,modulegen 和 extgen 有什么区别?

ant - 使用 Apache Ant 删除目录中的所有文件(不包含子目录)

ant - Gradle:通过从属性文件中查找 token 来替换 token

python - 使用python从内网下载文件

java - 通过 FTP 下载图片并出现 Java 防火墙问题

java - 增强型 for 循环中局部变量的范围

java - Tomcat 上的证书配置

java - TD 在运行时扩展

firewall - 我的防火墙阻止了从 docker 容器到外部的网络连接

java - 在 youtube.videos.insert() 请求中使用部分 ="...,processingDetails"时出错