You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 "example.com/api/sendhttp.php?authkey=abc&mobiles=你的测试手机号&message=测试内容&route=4&sender=你的senderId"
    
    如果curl也失败,那就是网络层面的问题——比如DNS解析失败、Ubuntu防火墙限制、接口需要代理等;如果curl能成功,再看Java程序的问题。
  • 检查终端的代理设置:如果你的系统需要代理访问外网,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:16:41