1

私のJavaアプレットは、テスト目的でローカルホスト上のmysqlデータベースに接続します。eclipseから実行すると正常に動作しますが、ブラウザーを介してdbにアクセスできません。ブラウザーが何らかの理由でローカルホストデータベースをサポートしていないか、コードに問題があるため、知りたかったのです。また、ブラウザがそれをサポートしていない場合、サーバーにアップロードせずに何らかの方法でテストすることは可能ですか?

4

2 に答える 2

1

その理由は、アプレットがコンピューターのローカル ポートにアクセスするためのセキュリティ アクセス許可を持っていないためです。Java は、人々のコンピュータを保護するためにこれを行います。Web ページを開いたときに、アプレットがローカル ポートへのアクセスを許可されていたかどうかを考えてみてください。数秒でコンピュータがハッキングされる可能性があります。

自分のやり方でやりたい場合は、アプレットを jar ファイルにパッケージ化し、署名して検証し、それらの権限を受け取ることができるようにする必要があります。興味のある方は、次の情報をご覧ください。

jar ファイルを作成する
方法 jar ファイルに署名して検証する
方法 jar パッケージ化されたソフトウェアを実行する方法

それがあなたが取りたいアプローチであるなら、これらはすべて素晴らしいリソースです。私がすることは、サーブレットをセットアップするか(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 をサーバーに追加してから、アプレットのクライアント部分を作成することだけです。幸運を!

于 2012-06-04T00:38:45.757 に答える
0

アプレットとデータベースの間にサーブレットを配置することをお勧めします。そのようにデータベースを Web に公開するべきではありません。アプレットからサーブレットにリクエストを送信し、サーブレットに代わって介入させる方がよいでしょう。サーブレットは、入力を認証および承認し、検証およびバインドし、応答をマーシャリングして送り返すことができます。

于 2012-06-04T00:14:23.097 に答える