Ubuntu终端运行Java短信发送程序失败求助
解决Ubuntu 14终端运行Java短信发送程序无响应问题
我在Netbeans中可通过Java类正常发送短信,但在Ubuntu 14系统的终端/命令行运行时无法工作,且无任何错误抛出。我已尝试使用JDK 7/1.8不同版本编译程序,问题仍存在。
相关代码
String authkey = "abc"; String mobiles = mobile; mobiles = Arrays.stream(mobiles.split(",")) .distinct() .collect(Collectors.joining(",")); String senderId = sid; String message = msg; String route="4"; //Transaction URLConnection myURLConnection=null; URL myURL=null; BufferedReader reader=null; String encoded_message=message.trim(); String mainUrl="example.com/api/sendhttp.php?"; StringBuilder sbPostData= new StringBuilder(mainUrl); sbPostData.append("authkey=").append(authkey); sbPostData.append("&mobiles=").append(mobiles); sbPostData.append("&message=").append(encoded_message); sbPostData.append("&route=").append(route); sbPostData.append("&sender=").append(senderId); mainUrl = sbPostData.toString(); try { //prepare connection myURL = new URL(mainUrl); myURLConnection = myURL.openConnection(); myURLConnection.connect(); reader= new BufferedReader(new InputStreamReader(myURLConnection.getInputStream())); //reading response String response; while ((response = reader.readLine()) != null) { //print response System.out.println(response); } //finally close connection reader.close(); } catch (IOException e) { JOptionPane.showMessageDialog (null,"Could not send SMS"+e); }
首先得说,你现在看不到错误信息是最大的问题!代码里的异常处理用了JOptionPane.showMessageDialog——这是Swing的图形弹窗组件,但Ubuntu终端没有图形界面,所以异常信息直接被吞了,你根本不知道哪里出问题。先把这个坑填上,再一步步排查:
1. 先修复异常输出,拿到真实错误
把catch块里的弹窗代码换成控制台输出,这样终端运行时就能看到具体错误了:
catch (IOException e) { System.err.println("发送短信失败:" + e.getMessage()); e.printStackTrace(); // 打印完整的异常栈,方便定位问题 }
2. 排查终端环境的网络访问问题
NetBeans运行时用的是桌面用户的网络配置,但终端环境可能有差异:
- 先在终端用
curl直接测试短信接口是否能访问:
如果curl也失败,那就是网络层面的问题——比如DNS解析失败、Ubuntu防火墙限制、接口需要代理等;如果curl能成功,再看Java程序的问题。curl "example.com/api/sendhttp.php?authkey=abc&mobiles=你的测试手机号&message=测试内容&route=4&sender=你的senderId" - 检查终端的代理设置:如果你的系统需要代理访问外网,NetBeans可能已经配置了代理,但终端没设置。可以临时设置代理再测试:
export http_proxy=http://你的代理地址:端口 export https_proxy=http://你的代理地址:端口 java 你的程序类名
3. 修复URL编码问题
你的代码直接把短信内容、手机号拼接进URL,没有做URL编码。如果内容里有空格、特殊字符(比如&、中文),终端环境的编码(通常是UTF-8)会导致URL解析错误,而NetBeans的环境可能刚好兼容了这个问题。给参数做URL编码:
import java.net.URLEncoder; // ... String encoded_message = URLEncoder.encode(message.trim(), "UTF-8"); String encoded_mobiles = URLEncoder.encode(mobiles, "UTF-8"); String encoded_senderId = URLEncoder.encode(senderId, "UTF-8"); // 拼接参数时用编码后的字符串 sbPostData.append("authkey=").append(authkey); sbPostData.append("&mobiles=").append(encoded_mobiles); sbPostData.append("&message=").append(encoded_message); sbPostData.append("&route=").append(route); sbPostData.append("&sender=").append(encoded_senderId);
4. 确认终端的Java环境
虽然你换了JDK版本,但终端的JAVA_HOME和PATH可能没同步更新。运行以下命令确认当前使用的JDK版本是否和NetBeans一致:
java -version javac -version
另外,终端运行程序的用户权限是否和NetBeans一致?比如NetBeans用普通用户,终端用root,可能导致网络配置差异。
先按这几步来,拿到异常信息后就能更精准地定位问题了。
内容的提问来源于stack exchange,提问作者A Singh
相关产品推荐
相关产品推荐

