Avatar billede tosssen Nybegynder
20. august 2004 - 12:10 Der er 32 kommentarer og
2 løsninger

Håndtering af high-score over netværk

Hej!

Jeg er netop ved at lægge sidste hånd på et tetrisspil til webstart og til dette kunne jeg godt tænke mig et high-score system, hvor top 10 gemmes og løbende ajourføres på en central server. Jeg har imidlertid ingen erfaring med netværksprogrammering, så jeg kunne godt bruge nogle fif til hvordan man bedst angriber problemet og hvad der kræves af server osv.
Jeg vil så vidt muligt gerne undgå OS specifik kode.

Håber der er nogen der har tid til at hjælpe.

Søren
Avatar billede arne_v Ekspert
20. august 2004 - 12:56 #1
internet>

Lad spillet hente current high score med en HTTP GET request til
et ASP eller PHP script som henter fra database.

Lad spillet opdatere high score med en HTTP POST request til
et ASP eller PHP script som gemmer til database.

(du kan selvfølgelig også bruge JSP/servlet i.s.f. ASP eller PHP, men
det er jo ikke så udbredt på web hoteller)

intranet>

Hent og opdater high score direkte i database med JDBC.
Avatar billede arne_v Ekspert
20. august 2004 - 12:59 #2
Client kan laves i pure Java og være fuldt platforms uafhængigt i begge tilfælde.

Intanet løsningen kræver bare en database som man få en JDBC driver til. Og det
kan du stort set til alle database med undtagelse af MS Access. Platform er
ligegyldig.

Internet løsningen kan du som sagt vælge frit mellem et større antal
server side script sprog. Når du har valgt så kan du jo se hvilke platforme
det pågældende server side script sprog kører på (PHP og JSP/servlet
kører på alle gængse platforme).
Avatar billede tosssen Nybegynder
20. august 2004 - 13:05 #3
Lyder godt! Jeg vil prøve at se lidt på dit internetforslag! Kender du forresten et webhotel, som virker ordentligt med webstart? Mit nuværende gratis webhotel er sat op således at internet explorer ikke virker med webstart, så det ville være rart at finde et sted hvor folk ikke er nødt til at bruge netscape eller andre alternativer.
Avatar billede arne_v Ekspert
20. august 2004 - 13:57 #4
Det lyder altså mere som et IE problem end som et web hotel problem.
Avatar billede tosssen Nybegynder
20. august 2004 - 14:30 #5
Det er også et IE problem (noget med cache - har læst om det for lang tid siden), som kan løses ved at serveren indstilles på en bestemt måde, så problemet i IE omgås. Så er det er måske også et spørgsmål om at finde et webhotel, hvor ejerne gider indstille det ;-)
Avatar billede arne_v Ekspert
20. august 2004 - 14:55 #6
Ellers må du lave et lille server side script som server filerne med de rigtige headere !
Avatar billede tosssen Nybegynder
20. august 2004 - 15:37 #7
Jeg kunne vel ikke for eventuelle ekstra points lokke dig til at løfte sløret for noget kode (både java og php) som kan sende en String til en server og hente det igen? Så kan jeg selv udvide derfra. Jeg kunne virkelig godt bruge en lille primer for at komme videre!
Avatar billede arne_v Ekspert
20. august 2004 - 15:40 #8
Jeg lavede engang den her kode til applet-PHP-MySQL.

Du bruger så Java WebStart men jeg tror at forksellen er lille.

DatabaseApplet.java:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.*;

public class DatabaseApplet extends Applet implements ActionListener {
    TextArea select = new TextArea();
    TextField f1 = new TextField();
    TextField f2 = new TextField();
    Button insert = new Button();
    public void init() {
        select.setColumns(40);
        select.setRows(20);
        select.setText(select());
        f1.setColumns(10);
        f2.setColumns(20);
        insert.setLabel("Add");
        insert.addActionListener(this);
        add(select, null);
        add(f1, null);
        add(f2, null);
        add(insert, null);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent ev) {
        insert(f1.getText(), f2.getText());
        select.setText(select());
        repaint();
    }
    private String select() {
        StringBuffer res = new StringBuffer("");
        try {
            URL url = new URL("http://localhost/select.php");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.connect();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String line;
                while ( (line = br.readLine()) != null) {
                    res.append(line);
                    res.append("\r\n");
                }
                con.disconnect();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return res.toString();
    }
    private void insert(String f1, String f2) {
        try {
            URL url = new URL("http://localhost/insert.php");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            String info = "F1=" + f1 + "&F2=" + f2;
            con.setDoOutput(true);
            con.getOutputStream().write(info.getBytes());
            con.connect();
            if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
                System.err.println("POST failed");
            }
            con.disconnect();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

select.php:

<?php
$con = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("Test") or die(mysql_error());
$rs = mysql_query("SELECT * FROM T1") or die(mysql_error());
while ($row = mysql_fetch_array($rs, MYSQL_ASSOC)) {
    print $row["F1"] . " " . $row["F2"] . "\n";
}
mysql_free_result($rs);
mysql_close($con);
?>

insert.php:

<?php
$con = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("Test") or die(mysql_error());
$f1 = $_POST["F1"];
$f2 = $_POST["F2"];
mysql_query("INSERT INTO T1(F1,F2) VALUES($f1,'$f2')") or die(mysql_error());
mysql_close($con);
?>
Avatar billede arne_v Ekspert
20. august 2004 - 15:42 #9
Ovenstående skovler bare de selectede data råt ind i et text area, men man
kunen selvfølgelig sagtens parse det og processe det mere avanceret.
Avatar billede tosssen Nybegynder
20. august 2004 - 16:02 #10
Kodeforsøg med insert.php og select.php liggende på server:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.*;

public class HighScore
{
    public static String select() {
        StringBuffer res = new StringBuffer("");
        try {
            URL url = new URL("http://www.projektrandom.frac.dk/select.php");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.connect();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String line;
                while ( (line = br.readLine()) != null) {
                    res.append(line);
                    res.append("\r\n");
                }
                con.disconnect();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return res.toString();
    }
    public static void insert(String f1, String f2) {
        try {
            URL url = new URL("http://www.projektrandom.frac.dk/select.php");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            String info = "F1=" + f1 + "&F2=" + f2;
            con.setDoOutput(true);
            con.getOutputStream().write(info.getBytes());
            con.connect();
            if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
                System.err.println("POST failed");
            }
            con.disconnect();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
   
    public static void main(String[] args)
    {
        HighScore.insert("testing","...");
        System.out.println(HighScore.select());
    }
}



Fejl:

<br />
<b>Warning</b>:  mysql_connect(): Access denied for user: 'root@localhost' (Using password: NO) in <b>/web/www/frac/users/projektrandom/select.php</b> on line <b>2</b><br />
Access denied for user: 'root@localhost' (Using password: NO)
Avatar billede arne_v Ekspert
20. august 2004 - 16:04 #11
Har du rettet:

$con = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("Test") or die(mysql_error());

til så de passer til din srever/webhotel ?
Avatar billede tosssen Nybegynder
20. august 2004 - 16:17 #12
Nope - hvordan finder jeg ud af hvad jeg skal skrive i stedet?
Avatar billede arne_v Ekspert
20. august 2004 - 16:23 #13
Du må da kender:
  MySQL server navn
  MySQL brugernavn
  MySQL password
  MySQL database

Hvordan connecter du normalt til din MySQL database ?
Avatar billede tosssen Nybegynder
20. august 2004 - 16:26 #14
Hehe det gør jeg normalt ikke ;-) Men undersøger det nu!
Avatar billede tosssen Nybegynder
20. august 2004 - 16:31 #15
Done. Men får nu følgende fejl ved at køre ovenstående program

Table 'projektrandom.T1' doesn't exist
Avatar billede tosssen Nybegynder
20. august 2004 - 16:34 #16
insert.php:

<?php
$con = mysql_connect("localhost", "projektrandom", "mitPW") or die(mysql_error());
mysql_select_db("projektrandom") or die(mysql_error());
$f1 = $_POST["F1"];
$f2 = $_POST["F2"];
mysql_query("INSERT INTO T1(F1,F2) VALUES($f1,'$f2')") or die(mysql_error());
mysql_close($con);
?>

select.php:

<?php
$con = mysql_connect("localhost", "projektrandom", "mitPW") or die(mysql_error());
mysql_select_db("projektrandom") or die(mysql_error());
$rs = mysql_query("SELECT * FROM T1") or die(mysql_error());
while ($row = mysql_fetch_array($rs, MYSQL_ASSOC)) {
    print $row["F1"] . " " . $row["F2"] . "\n";
}
mysql_free_result($rs);
mysql_close($con);
?>
Avatar billede arne_v Ekspert
20. august 2004 - 16:35 #17
Det er fordi de stykker kode forventer entabel T1 med to felter F1 og F2 som er henholdsvis INTEGER og VARCHAR(50).

Det skal du jo have rettet til til dit behov.
Avatar billede tosssen Nybegynder
20. august 2004 - 16:38 #18
Ahh smart! Hvordan opretter jeg tabellen OverallScore med felterne Name og Score?
(Du skal nok få masser af points for det her)
Avatar billede arne_v Ekspert
20. august 2004 - 16:47 #19
CREATE TABLE OverallScore (
  Name VARCHAR(50),
  Score INTEGER
);

eller noget lignende.
Avatar billede arne_v Ekspert
20. august 2004 - 19:46 #20
OK at jeg ligger et svar nu ?
Avatar billede tosssen Nybegynder
26. august 2004 - 12:32 #21
Ja, det er ok. Lige en sidste ting. Jeg vil gerne gøre sådan at man sender passwordet til databasen via java, men kan ikke få det til at virke. Kan du se hvad der er galt med følgende:

cleartable.php

<?php

// set your infomation.
$dbhost='localhost';
$dbusername='projektrandom';
$dbuserpass= $_GET['pw'];
$dbname='projektrandom';

// connect to the mysql database server.
$link_id = mysql_connect ($dbhost, $dbusername, $dbuserpass);
echo "success in database connection.";

// select the specific database name we want to access.
//$dbname=$dbusername."_".$dbname;
if (!mysql_select_db($dbname)) die(sql_error());
echo "success in database selection.";

// add a table to the selected database
$result="DROP TABLE test_hiscore_table";
if (mysql_query($result)){
echo "success in table clearance.";
} else {
echo "no table cleared.";
}
$result2="CREATE TABLE test_hiscore_table (name VARCHAR(25), score Integer)";
if (mysql_query($result2)){
echo "success in table creation.";
} else {
echo "no table created.";
}

?>

Java-metode:

    public static void clearTable()
    {
        try {
            URL url = new URL("http://www.projektrandom.frac.dk/clearTable.php");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            String info = "pw="+pw;
            con.setDoOutput(true);
            con.getOutputStream().write(info.getBytes());
            con.connect();
            if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
                System.err.println("clearTable failed");
            }
            con.disconnect();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

Variablen pw er en statisk member variabel i klassen. Jeg får fejlen "clearTable failed"
Avatar billede arne_v Ekspert
26. august 2004 - 12:34 #22
$dbuserpass= $_GET['pw'];

skal måske være

$dbuserpass= $_POST['pw'];
Avatar billede tosssen Nybegynder
26. august 2004 - 12:34 #23
Hmm accepter knappen virker ikke, så jeg kan ikke give dig points lige nu...
Avatar billede arne_v Ekspert
26. august 2004 - 12:35 #24
Har du husket at markere med navn så det er blåt inden du klikker accepter ?
Avatar billede arne_v Ekspert
26. august 2004 - 12:36 #25
jeg kan også prøve at svare igen
Avatar billede tosssen Nybegynder
26. august 2004 - 12:37 #26
Sådan - skulle lige markere ;-)
Avatar billede tosssen Nybegynder
26. august 2004 - 12:37 #27
Det virker heller ikke med POST :(
Avatar billede arne_v Ekspert
26. august 2004 - 12:40 #28
Hvad kommer der over som pw ?

Du kan jo bare echo'e den for debug.
Avatar billede tosssen Nybegynder
26. august 2004 - 12:45 #29
Hvis jeg skal echo'e den, så kommer echo'et ikke ud på std out, hvilket vil jeg sige at jeg er nødt til at give pw på adresselinjen, men jeg kan sagtens få det til at virke over adresselinjen, hvor der skal bruges _GET
Avatar billede tosssen Nybegynder
26. august 2004 - 12:51 #30
Har du et forslag til hvordan man kan få debug output når man kalder det fra Java?
Avatar billede arne_v Ekspert
26. august 2004 - 12:53 #31
Ja hent input stream fra connection og udskriv den.
Avatar billede tosssen Nybegynder
26. august 2004 - 12:57 #32
Ja ok har fejlen nu - jeg går ind og hænger mig selv... jeg connecter til clearTable.php, som ikke findes, så nu har jeg rettet det til cleartable.php. Dumt!! Mange tak for hjælpen - håber ikke dette vil frustrere dig lige så meget som mig...
Avatar billede arne_v Ekspert
26. august 2004 - 13:06 #33
Den slags sker.
Avatar billede tosssen Nybegynder
26. august 2004 - 13:32 #34
Det var pænt sagt ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester