我需要知道如何设置代理并确认它是否正常工作。
我做了一个看起来像这样的测试程序:
您可以在其中指定代理地址和端口号。
(我找到了地址和端口: 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调用并验证代理是否正在使用?
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();
}
}
答案 0 :(得分:6)
使用proxy:
的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;
}
}
答案 1 :(得分:0)
您可以使用Java Proxy
类 - 更多详细信息here。实质上,您可以尝试指定的Proxy
地址是否为reachable
。如果是,您可以建立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()
的可信度值得怀疑,您可以尝试捕获异常并建立自己的boolean
标记,以下是工作示例。
在这里,您尝试通过proxy
连接使用其地址和端口连接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