CodenameOne应用无代理时Connection refused错误的原因与解决方法
CodenameOne取消代理后图片下载失败(Connection refused)问题排查与解决
问题场景
运行以下CodenameOne代码实现图片下载并显示功能:
int WIDTH = Display.getInstance().getDisplayWidth(); Form f = new Form(); f.getToolbar().hideToolbar(); f.getStyle().setBgColor(0xFFFFFF); EncodedImage placeholder = EncodedImage.createFromImage(Image.createImage(WIDTH, WIDTH), false); URLImage puppyImage = URLImage.createToStorage(placeholder, "puppy.png", "https://images.newscientist.com/wp-content/uploads/2021/06/03141753/03-june_puppies.jpg?crop=1:1,smart&width=1200&height=1200&upscale=true"); Container imageContainer = new Container(); imageContainer.add(puppyImage); f.add(imageContainer); f.show();
代理环境下应用运行正常,图片可成功下载保存;但取消代理后抛出连接拒绝错误,堆栈信息如下:
java.net.ConnectException: Connection refused: connect at java.base/java.net.PlainSocketImpl.connect0(Native Method) at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:101) at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412) at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255) at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237) at java.base/java.net.Socket.connect(Socket.java:608) at java.base/java.net.Socket.connect(Socket.java:557) at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:182) at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474) at java.base/sun.net.www.http.HttpClient$1.run(HttpClient.java:526) at java.base/sun.net.www.http.HttpClient$1.run(HttpClient.java:524) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/sun.net.www.http.HttpClient.privilegedOpenServer(HttpClient.java:523) at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:564) at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:265) at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:372) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:212) at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1208) at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1081) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:189) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1592) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1520) at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:334) at com.codename1.impl.javase.JavaSEPort.getResponseCode(JavaSEPort.java:10179) at com.codename1.io.ConnectionRequest.performOperationComplete(ConnectionRequest.java:905) at com.codename1.io.NetworkManager$NetworkThread.runCurrentRequest(NetworkManager.java:314) at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:390) at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
原因分析
- 本地网络环境限制:所在网络(如企业/校园网)的防火墙或出站规则强制要求通过代理访问外部HTTPS资源,直接连接被拦截。
- 代理配置残留:取消代理后,CodenameOne应用或开发环境仍保留旧的代理配置,导致尝试用无效代理地址发起连接。
- DNS解析失败:本地DNS服务器无法正确解析目标图片的域名,导致无法建立有效连接。
- 目标服务器IP限制:目标服务器限制了你的公网IP访问,仅允许代理IP段的请求。
解决办法
1. 验证本地网络可用性
- 直接在浏览器中打开目标图片URL,确认是否能正常加载。如果浏览器也无法访问,说明是网络环境问题,需联系网络管理员开放出站HTTPS权限,或确认是否必须使用代理。
2. 清除代理配置残留
- 在代码中显式重置网络代理设置:
// 清除全局代理配置 ConnectionRequest.setProxy(null, 0); NetworkManager.getInstance().clearProxy(); - 完全重启CodenameOne开发环境和应用,确保旧配置被彻底清除。
3. 修复DNS解析问题
- 在命令行执行
nslookup images.newscientist.com,检查是否能返回正确的IP地址。 - 切换公共DNS服务器(如8.8.8.8或114.114.114.114),重新测试DNS解析和应用连接。
4. 验证服务器访问权限
- 使用手机热点等其他网络测试应用,如果能正常下载图片,说明当前网络的IP被目标服务器限制,需更换网络或联系服务器管理员。
5. 添加异常处理优化体验
- 在图片下载代码中添加异步回调,处理下载失败场景:
String imageUrl = "https://images.newscientist.com/wp-content/uploads/2021/06/03141753/03-june_puppies.jpg?crop=1:1,smart&width=1200&height=1200&upscale=true"; URLImage puppyImage = URLImage.createToStorage(placeholder, "puppy.png", imageUrl, new URLImage.ImageAdapter() { @Override public EncodedImage adaptImage(EncodedImage downloadedImage, EncodedImage placeholderImage) { return downloadedImage; } @Override public boolean asyncOperationComplete(boolean success) { if (!success) { Dialog.show("提示", "图片下载失败,请检查网络设置", "确定", null); } return success; } });
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

