我的 Java 小程序连接到 localhost 上的 mysql 数据库以进行测试。当我从 Eclipse 运行它时它工作正常,但它无法通过浏览器访问 db。我想知道是因为浏览器出于某种原因不支持 localhost db 还是我的代码有问题。如果浏览器不支持它,是否可以在不上传到服务器的情况下以某种方式对其进行测试?
2 回答
原因是您的小程序没有访问计算机本地端口的安全权限。Java 这样做是为了保护人们的计算机。想一想您是否打开了一个网页并且允许 Applet 访问您的本地端口。你可以在几秒钟内让你的电脑被黑。
如果您想按照您的方式进行操作,您需要将您的小程序打包到一个 jar 文件中,对其进行签名并验证它,以便它可以接收这些权限。如果您有兴趣,这里有一些信息供您参考:
如何创建jar文件
如何对jar文件进行签名和验证
如何运行jar打包软件
如果这就是您想要采取的方法,那么所有这些都是很好的资源。我要做的是设置一个 Servlet(请参阅 duffymo 的答案)或设置一个 ProxyServer 以在您的计算机和小程序之间中继信息。如果您想了解更多信息,请告诉我,我可以提供。
编辑:
这是很多代码,但我想你会明白的,我希望这会有所帮助。您当然必须编写连接到服务器并从数据库请求信息的客户端。
数据库服务器.java:
import java.io.IOException;
import java.net.*;
import java.util.ArrayList;
import java.util.Iterator;
public class DatabaseServer implements Runnable
{
public DatabaseServer()
{
System.out.println("Created new server!");
clients = new ArrayList<Client>(); // this is a list of all the clients connected to the server
connected = false;
running = false;
connect(); // starts server
}
public void run()
{
System.out.println("Waiting for clients.../n");
while(running)
{
try
{
Socket socket = server.accept(); // waits for a client to connect
System.out.println("Client connected! "+socket.getInetAddress());
Client client = new Client(this, socket); // creates a new client object
clients.add(client);// adds it to the list
// cleans the client list everytime a new client connects
Iterator<Client> it = clients.iterator();
while(it.hasNext())
{
Client next = it.next();
if(!next.connected)
{
next.disconnect();
it.remove();
}
}
}catch(IOException e){e.printStackTrace();}
}
}
public void connect()
{
if(!connected)
{
System.out.println("starting server...");
try
{
System.out.println("opening port...");
server = new ServerSocket(8080); // opens a server socket
System.out.println("server started on port: "+server.getLocalPort());
running = true;
connected = true;
thread = new Thread(this);// starts the server thread
thread.start();
}catch(Exception e){e.printStackTrace(); connected = false; running = false;}
}
}
public void disconnect()
{
//stops the server
try
{
server.close();
}catch(Exception e){e.printStackTrace();}
server = null;
if(thread != null)
thread.interrupt();
thread = null;
connected = false;
running = false;
}
public void handleMessage(Client client, String message)
{
/* this is where you do your database interactions, based on the message you can pull out specific
* information from your database and then send it back to the client using client.sendMessage()
*/
}
private Thread thread;
private boolean running;
private boolean connected;
private ServerSocket server;
private ArrayList<Client> clients;
public static void main(String args[])
{
new DatabaseServer(); // makes a new server
}
}
客户端.java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client implements Runnable
{
public Client(DatabaseServer server, Socket socket)
{
this.socket = socket;
this.server = server;
try
{
connected = true;
writer = new PrintWriter(socket.getOutputStream()); // opens an output stream
reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // opens an input stream
running = true;
thread = new Thread(this);
thread.start();// starts the client thread
}catch(Exception e){e.printStackTrace(); connected = false;}
}
public void run()
{
try
{
String message = "";
while((message = reader.readLine()) != null & running & connected) // waits for a message to be recieved
{
server.handleMessage(this, message); // tells server to handle message
}
}catch(IOException e){e.printStackTrace(); connected = false;}
}
public void disconnect()
{
// disconnects client
try
{
socket.close();
}catch(Exception e){e.printStackTrace();}
try
{
reader.close();
}catch(Exception e){e.printStackTrace();}
try
{
writer.close();
}catch(Exception e){e.printStackTrace();}
socket = null;
reader = null;
writer = null;
if(thread != null)
thread.interrupt();
thread = null;
connected = false;
running = false;
}
public void sendMessage(String message)
{
// sends a message back to the client
writer.println(message);
writer.flush();
}
public boolean connected;
private boolean running;
private Thread thread;
private DatabaseServer server;
private Socket socket;
private PrintWriter writer;
private BufferedReader reader;
}
您的小程序将连接到此服务器,然后您可以向服务器发送消息以从数据库中请求信息。您所要做的就是将 mysql 内容添加到服务器,然后编写 applet 的客户端部分。祝你好运!
我建议在小程序和数据库之间放置一个 servlet。您不应该像那样将数据库暴露给网络。最好让applet 向servlet 发送请求并让它代表它进行调解。servlet 可以验证和授权、验证和绑定输入,并编组响应以发回。