我正在尝试将Java Applet连接到MySQL数据库。我知道它有效,因为我可以在localhost上连接到它,它可以很好地检索记录列表。但是,当我把它放在互联网上时,它不起作用。
这是我的小程序:http://mystikrpg.com/play
已签名,但我一直收到以下异常:
SQLException获取原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败
成功发送到服务器的最后一个数据包是0毫秒前。驱动程序未收到来自服务器的任何数据包。
这怎么可能发生,我该怎么做才能解决这个问题?
以下是applet源代码:http://sodan.pastebin.com/jWKTgBSU
答案 0 :(得分:5)
首先,以下例外
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
可能有以下原因:
此外,您是否实现 Java applet在客户端机器上实际运行?即webbrowser运行的机器。客户端基本上从Web服务器下载applet,然后在客户端(本地)机器上执行。 JDBC连接字符串jdbc:mysql://localhost:3306
将尝试连接到与运行applet的机器运行的MySQL数据库。您无法合理地期望世界上的每个客户端都运行MySQL数据库,更不用说您的数据库/表。
如果您只想访问服务器计算机上托管的MySQL服务器(运行Web服务器的地方),并且您希望让applet与之通信,那么您必须创建并运行 webservice < / em>在网络服务器上。既然你用[PHP]
标记了这个问题,我猜你在服务器端使用PHP,在这种情况下,只需创建一个PHP脚本,根据请求参数或pathinfo执行相应的MySQL操作。返回MySQL结果,例如JSON或XML字符串。在Applet中,您可以使用Java SE内置java.net.URLConnection
或更方便的Apache HttpComponents Client与Web服务器进行通信。 E.g。
URLconnection connection = new URL(getCodeBase(), "script.php?action=getdetails&productid=1").openConnection();
InputStream response = connection.getInputStream();
// ...
在Java中,您可以使用Google Gson使用JAXP处理任何XML响应来处理任何JSON响应。
那说(和无关当前问题),您使用的JDBC驱动程序名称是已弃用 org.gjt.mm.mysql.Driver
。我强烈建议使用十年前引入的正确驱动程序名称来替换旧的驱动程序名称:com.mysql.jdbc.Driver
。此外,还不需要Class#newInstance()
之后的Class#forName()
来电。它是在旧驱动程序中解决 bug 。另请参阅this explanation。
答案 1 :(得分:0)
当远程访问文件或数据库时,它们没有足够的权限来访问文件或数据库。这就是JVM通过沙盒使用安全性的方式......
这就是我对applet特权的了解......