Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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中通过代理发送SOAP消息_Java_Soap_Proxy - Fatal编程技术网

Java中通过代理发送SOAP消息

Java中通过代理发送SOAP消息,java,soap,proxy,Java,Soap,Proxy,我需要知道如何设置代理并确认它正在工作 我制作了一个测试程序,如下所示: 您可以在其中指定代理地址和端口号 (我发现地址和港口在: ) 选中“使用代理”时,SOAP调用如下所示: Socket socket = new Socket(); SocketAddress sockaddr = new InetSocketAddress(PROXY_ADDRESS, PROXY_PORT); socket.connect(sockaddr, 10000

我需要知道如何设置代理并确认它正在工作

我制作了一个测试程序,如下所示:

您可以在其中指定代理地址和端口号

(我发现地址和港口在: )

选中“使用代理”时,SOAP调用如下所示:

        Socket socket = new Socket();
        SocketAddress sockaddr = new InetSocketAddress(PROXY_ADDRESS, PROXY_PORT);
        socket.connect(sockaddr, 10000);
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(socket.getInetAddress(), PROXY_PORT));
        URL url = new URL(urlStr);
        HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy);
        return connection.call(message, uc);
这里的问题是最后一行
SOAPConnection.call(..)
不允许
HttpURLConnection
作为输入,因此给出:

端点类型错误

知道如何向SOAP调用添加代理地址并验证代理是否正在使用吗

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.URL;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;

public class TestProxy implements ActionListener {

    public JTextField proxyField;
    public JTextField portField;
    public JCheckBox useProxy;

    // GUI
    public TestProxy() {
        JFrame f = new JFrame("Proxy tester");
        f.getContentPane().setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS));

        proxyField = new JTextField("103.247.43.218");
        portField = new JTextField("8081");
        useProxy = new JCheckBox("Use Proxy");

        JButton b = new JButton("Connect!");
        b.addActionListener(this);

        f.getContentPane().add(proxyField);
        f.getContentPane().add(portField);
        f.getContentPane().add(useProxy);
        f.getContentPane().add(b);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    // ACTION
    @Override
    public void actionPerformed(ActionEvent e) {

        SOAPMessage response = null;
        try {
            SOAPMessage msg = createSOAPRequest();
            String urlStr = "http://www.webservicex.net/CurrencyConvertor.asmx?WSDL";
            response = sendSOAPMessage(msg, urlStr);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (SOAPException e1) {
            e1.printStackTrace();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
        if (response == null)
            JOptionPane.showMessageDialog(null, "Null returned...");
        else
            JOptionPane.showMessageDialog(null, "Returned response!!!");
    }

    // SOAP CALL
    public SOAPMessage sendSOAPMessage(SOAPMessage message, String urlStr) throws SOAPException, MalformedURLException {

        String PROXY_ADDRESS = proxyField.getText();
        int PROXY_PORT = Integer.parseInt(portField.getText());
        try {
            SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance();
            SOAPConnection connection = factory.createConnection();
            if (useProxy.isSelected()) {
                Socket socket = new Socket();
                SocketAddress sockaddr = new InetSocketAddress(PROXY_ADDRESS, PROXY_PORT);
                socket.connect(sockaddr, 10000);
                Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(socket.getInetAddress(), PROXY_PORT));
                URL url = new URL(urlStr);
                HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy);
                // This "call" is not allowed!!
                return connection.call(message, uc);
            } else {
                return connection.call(message, urlStr);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    // SOAP MESSAGE
    private static SOAPMessage createSOAPRequest() throws Exception {
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        return soapMessage;
    }

    public static void main(String[] args) {
        new TestProxy();
    }
}

您可以使用Java
Proxy
class-更多详细信息。本质上,您可以尝试指定的
代理
地址是否可访问。在这种情况下,您可以建立
URL
连接(如下所示的HTTP连接或您自己的协议,如SOAP) 编辑:

Content: text/html; charset=UTF-8
使用
SocketAddress
尝试使用端口值

   Socket socket = null;
        try {
            SocketAddress sockaddr = new InetSocketAddress(PROXY_ADDRESS,
                    PROXY_PORT);

            socket = new Socket();

            socket.connect(sockaddr, 10000);
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
                    socket.getInetAddress(), PROXY_PORT));

            if (socket.getInetAddress().isReachable(10000)) {
                URL url = new URL("http://www.popofibo.com");
                HttpURLConnection uc = (HttpURLConnection) url
                        .openConnection(proxy);
                System.out.println("Content: " + uc.getContentType());
                uc.connect();
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
在上面的示例中,您建立代理连接并检查
InetAddress
是否可访问。如果是,您可以使用代理建立http连接

编辑:由于
isReachable()
的可信度有问题,您可以尝试捕获异常并构建自己的
布尔值
标志,如下示例

在这里,您可以通过
Socket
连接,使用其地址和端口尝试连接
代理
,并捕获异常。我用我自己的代理服务器测试了这两个示例,它工作正常,对于您在示例中提到的
IP
,它肯定失败了

public static void main(String[] args) {
        Socket socket = new Socket();
        boolean proxyReachable = false;

        SocketAddress sockaddr = new InetSocketAddress(PROXY_ADDRESS,
                PROXY_PORT);

        try {
            socket.connect(sockaddr, 10000);
            proxyReachable = true;
        } catch (SocketTimeoutException e) {
            proxyReachable = false;

        } catch (IOException e) {
            proxyReachable = false;
        }

        if (proxyReachable) {
            try {
                Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
                        socket.getInetAddress(), PROXY_PORT));

                URL url = new URL("http://www.popofibo.com");

                HttpURLConnection uc = (HttpURLConnection) url
                        .openConnection(proxy);
                System.out.println("Content: " + uc.getContentType());
                uc.connect();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
输出(具有有效的代理地址/端口):

Content: text/html; charset=UTF-8

正在使用代理的sendSOAPMessage方法:

public static SOAPMessage sendSOAPMessage(SOAPMessage message, String url, final Proxy p) throws SOAPException, MalformedURLException {
    SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance();
    SOAPConnection connection = factory.createConnection();

    URL endpoint = new URL(null, url, new URLStreamHandler() {
        protected URLConnection openConnection(URL url) throws IOException {
            // The url is the parent of this stream handler, so must
            // create clone
            URL clone = new URL(url.toString());

            URLConnection connection = null;
            if (p.address().toString().equals("0.0.0.0/0.0.0.0:80")) {
                connection = clone.openConnection();
            } else
                connection = clone.openConnection(p);
            connection.setConnectTimeout(5 * 1000); // 5 sec
            connection.setReadTimeout(5 * 1000); // 5 sec
            // Custom header
            connection.addRequestProperty("Developer-Mood", "Happy");
            return connection;
        }
    });

    try {
        SOAPMessage response = connection.call(message, endpoint);
        connection.close();
        return response;
    } catch (Exception e) {
        // Re-try if the connection failed
        SOAPMessage response = connection.call(message, endpoint);
        connection.close();
        return response;
    }
}

谢谢“invalid proxy.com”的方法isReachable()给出了“UnknownHostException”。但对于我的真实代理,它返回false。知道它为什么会返回false吗?@是的,由于各种原因,它可能无法访问。您可能希望尝试增加超时值-更多详细信息。我试图演示使用这种方法可以访问代理,但您也可以解决它,捕获不同的异常。好的。我猜我还需要指定端口。但“InetAddress”似乎不能接受任何端口号?请看上面的编辑,您可以通过
SocketAddress
类使用端口。我从中派生出
InetAddress
,但如果仍然得到一个false,请摆脱不可靠的isRechable检查,只捕获一个
SocketTimeoutException
您的示例似乎也适用于我的本地代理(SquidMan)。但是我不知道如何在SOAP连接中使用它。如果没有两个不同的变量叫做
connection
,这个答案就会清楚得多。哦,还有两个不同的变量叫做
url
。这让我头疼。嗯@DawoodibnKareem,你可以编辑答案,让大家更清楚。这将有助于这里的每个人,而不是你的实际意见。