Reputation: 18200
I just talked to my host that I have my web page at and they say they allow JDBC connections.
Anyway, the page you can view this at is http://mystikrpg.com/mysqltest/mysqltry.html
Here is my error:
**** Looking for database...
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:343)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2308)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2122)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:774)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:375)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:289)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at test.init(test.java:38)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: java.security.AccessControlException: access denied (java.net.SocketPermission [0:0:0:0:0:0:0:1]:4464 connect,resolve)
at com.mysql.jdbc.StandardSocketFactory.unwrapExceptionToProperClassAndThrowIt(StandardSocketFactory.java:407)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:268)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:292)
... 16 more
java.lang.NullPointerException
at test.init(test.java:69)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Exception: java.lang.NullPointerException
and here is the code:
What am I doing wrong?
//package mysqltest;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.Applet;
import java.awt.TextArea.*;
import java.sql.*;
import java.util.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import java.net.*;
import java.applet.*;
public class test extends JApplet
{
public JTextArea c;
public void init()
{
c = new JTextArea();
add(c);
c.append("**** Looking for database...");
Connection conn = null;
Properties props = new Properties();
String url = "jdbc:mysql://localhost:3306/";
String dbName = "mystik";
String driver = "com.mysql.jdbc.Driver";
String userName = "root";
String password = "";
String loggedusername = getParameter("name");
boolean online = false;
try
{
Class.forName(driver).newInstance();
online = true;
if (online)
{
// if user loads applet online
conn = DriverManager.getConnection("jdbc:mysql://localhost:4464/jsfdan_mystikdan", "jsfdan_muser", "test");
}
else
{
// for localhost - testing purposes props.put("user", "root");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mystik", props);
}
c.append("\nConnected to the database");
c.append("\nGetting stats for: " + loggedusername);
PreparedStatement statement = conn.prepareStatement( "select * from `user` where `username` = '"+loggedusername+"'");
ResultSet result = statement.executeQuery();
// just a dumb mysql statement! while(result.next())
{
c.append("\nUsername: "+result.getString(2)+ "\nLevel: "+result.getString(6)+"\nEXP: "+result.getString(8)+"\n");
}
PreparedStatement updateEXP = conn.prepareStatement( "update`user` set `exp` = '666' where `username` = '"+loggedusername+"'");
updateEXP.executeUpdate();
ResultSet xresult = statement.executeQuery();
while(xresult.next())
{
c.append("\nUsername: "+xresult.getString(2)+ "\nLevel: "+xresult.getString(6)+"\nEXP: "+xresult.getString(8)+"\n");
}
c.append("\nDisconnected from database");
}
catch (Exception e)
{
System.out.println(c.getText());
e.printStackTrace();
}finally {
try {
conn.close();
}catch(SQLException dan) {dan.printStackTrace(); }
}
}
}
Upvotes: 0
Views: 6218
Reputation: 122649
Quoting your code:
// if user loads applet online
conn = DriverManager.getConnection("jdbc:mysql://localhost:4464/jsfdan_mystikdan", "jsfdan_muser", "test");
An applet is a program running on the user's machine, where the browser is. Thus, localhost
refers to the user's machine at this stage. Chances are that most users aren't running MySQL on their own machine, that even if they were, it wouldn't be the one your applet is after and that it would get out of the applet's sandboxed environment anyway.
EDIT (after discussion in comments):
From the discussions and the comments in the previous related questions, it looks like you're trying to connect directly to your MySQL server from an application (applet) distributed to clients that could be anywhere, which is usually the wrong approach.
With most services that use a database, the user-management and access control is done at the application level, not at the database level. This is particularly the case when you're using a shared provider that creates a database and a user account for your entire application to use, even if you want multiple users.
The typical workaround for this is do develop another service (typically a web-service) that your client will call, providing suitable authentication and usage context for the various operations you'd want the client to perform on the data.
I'm not sure if your hosting service lets you run Java services, but cheaper hosting providers tend to let you run PHP, Perl and/or Python services, so you could write a service in one of those languages and have your applet be a client that talk to them.
Explaining how to write web services is probably out of scope of this question/answer. In general, you'll probably come across 3 categories: REST-style web-services (it's an architectural style, guided by the notion of resources and representations), XML-RPC (often called "REST" by mistake, where you send fragments of XML to some web-page that will call a function/method and give you some results in return; you might be able to do the same with JSON) and SOAP (where you'll probably get more tools but might also be more bloated depending on what you're comfortable with). There have been on-going debates as to which is better, but it's up to you to investigate and choose what you think is better for your application. It will probably depend on what can be deployed on your host.
Upvotes: 3
Reputation: 994
The NPE is because Connection conn
is never initialized - that's what blows up.
I'd recommend you use a database connectivity tool (like the MySQL Workbench) to establish the correct URL from your system to mystikrpg.com
; once you have the correct URL, you can put it in your applet.
As @Bruno indicated, the applet runs locally.
Upvotes: 0