在Java中通过代理发送SOAP消息

我需要知道如何设置代理并确认它是否正常工作。

我做了一个看起来像这样的测试程序:

在此处输入图像描述

您可以在哪里指定代理地址和端口号。

(我找到了地址和端口: http : //www.freeproxylists.net/ )

当选中“使用代理”时,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作为输入,从而给出:

错误的endPoint类型

知道如何将代理地址添加到SOAP调用并validation代理是否正在使用?

 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(); } } 

使用代理的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; } } 

您可以使用Java Proxy类 – 此处提供更多详细信息。 实质上,您可以尝试是否reachable指定的Proxy地址。 万一它是你可以建立一个URL连接(如下所示的HTTP连接或你自己的协议 – 如SOAP) 编辑:

使用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()的可信度值得怀疑,您可以尝试捕获exception并建立自己的boolean标志,下面的工作示例。

在这里,您尝试通过Socket连接使用其地址和端口连接proxy并捕获exception。 我用我自己的代理服务器测试了这两个例子并且它可以工作,它肯定会失败,因为你在示例中提到的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