[英]Sending SOAP message by Proxy in Java
我需要知道如何設置代理並確認它是否正常工作。
我做了一個看起來像這樣的測試程序:
您可以在哪里指定代理地址和端口號。
(我找到了地址和端口: 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();
}
}
使用代理的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()
的可信度值得懷疑,您可以嘗試捕獲異常並建立自己的boolean
標志,下面的工作示例。
在這里,您嘗試通過Socket
連接使用其地址和端口連接proxy
並捕獲異常。 我用我自己的代理服務器測試了這兩個例子並且它可以工作,它肯定會失敗,因為你在示例中提到的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.