Avatar billede fastpoint Nybegynder
02. november 2005 - 13:06 Der er 37 kommentarer og
1 løsning

method <init> not found

Den fejl bliver registreret med denne kode og på første linje.

  <jsp:useBean id="player" class="mypackage.Spiller" scope="request" />
  <jsp:getProperty name="player" property="tekst" />

hvad betyder det?
Avatar billede arne_v Ekspert
02. november 2005 - 13:08 #1
man kunne få den ide at mypackage.Spiller manglede en constructor uden argumenter
Avatar billede fastpoint Nybegynder
02. november 2005 - 23:23 #2
lig et svar

kedelig "fejl" må man sige
Avatar billede arne_v Ekspert
02. november 2005 - 23:25 #3
svar
Avatar billede arne_v Ekspert
02. november 2005 - 23:29 #4
implements Serializable hvis man skulle få lyst til at sende den
private fields
public get og set
en constructor uden argumenter per bean konvention
en constructor med alle argumenterne for ens dovenskab
en toString så man kan logge fornuftigt
Avatar billede fastpoint Nybegynder
02. november 2005 - 23:37 #5
sidder og kigger på et flerbruger system på nettet, men ved ikke helt hvordan en af problemstillingerne skal takles.

Det drejer sig om et turbaseret online spil, men hvordan håndtere man hvis tur det er? er det med session? cookie? ipnummer og en arraylist?

et mini eksempel og gode links samt ideer er velkomne!
pointene i spørgsmålet bliver selvfølgelig justeret.
Avatar billede arne_v Ekspert
02. november 2005 - 23:41 #6
Du laver en session listener som har alle sessions i en collection den må
du så kunne bruge til at processe alle spillere.

[du skal lige huske at kunne håndtere situationen hvor listen ændrer sig
mens du itererer igennem den]
Avatar billede fastpoint Nybegynder
02. november 2005 - 23:44 #7
det er selvfølgelig ikke for, at være besværlig men hvordan laver man en session listener?

det lyder som noget smartere end hvad jeg selv har fundet på.
i min kode gemmer jeg ipnumret fra clienterne i en arraylist og har også en String hvor der står hvilket ipnummer der har en tur.

Logikken er i en servlet.

Jeg vil hellere end gerne starte forfra på ideer du har til det.
Avatar billede arne_v Ekspert
02. november 2005 - 23:49 #8
jeg prøver lige at finde noget
Avatar billede arne_v Ekspert
02. november 2005 - 23:51 #9
det er faktisk ret nemt

en klasse:

import javax.servlet.http.*;

public class SessionWatchDog implements HttpSessionListener {
  public void sessionCreated(HttpSessionEvent se) {
      // tilføj til listen
  }
  public void sessionDestroyed(HttpSessionEvent se) {
      // fjern fra listen
  }
}

og nogle linier til web.xml:

  <listener>
    <listener-class>SessionWatchDog</listener-class>
  </listener>
Avatar billede fastpoint Nybegynder
02. november 2005 - 23:51 #10
tusind tak!
Avatar billede arne_v Ekspert
02. november 2005 - 23:53 #11
se.getSession()

henter deres session
Avatar billede fastpoint Nybegynder
02. november 2005 - 23:55 #12
hvordan skal man så tjekke på hvem der har tur? og efterfølgende give turen videre?
i arraylist tjekkede jeg om der var flere i listen og hvis der var så blev turen sendt til i+1.

for at alle spillere skal loade de samme variabler i en klasse så skal variablerne vel være static ?
Avatar billede arne_v Ekspert
03. november 2005 - 00:03 #13
jeg forestiller mig

at du har din session listener som gemmer sessionerne i en ArrayList

at der ved login bliver gemt lidt info om spilleren i hans egen session

at du har spillet gemt et andet sted f.eks. i en singleton

at "gør noget" koden kører i en seperat tråd (startet i startup servlet måske ?)

at den henter arraylisten fra session listeneren løber den igennem og
"gør noget" i spil singleton'en for alle
Avatar billede fastpoint Nybegynder
03. november 2005 - 00:11 #14
er nærmest kun i proof of concept og har derfor ikke mange klasser med.
database delen er blandt andet undladt indtil videre.

Jeg har en JSP side hvor så snart den er åbnet så bliver man registreret som bruger. Den første om loader JSP siden er derfor den første som må lave et træk. Alle andre spillere kan altså ikke gøre noget endnu. JSP siden er meget simpel. Det er en form hvor man indtaster noget tekst og hvis det er ens tur så bliver teksten udskrevet på skærmen.

Formen kalder en servlet hvor logikken er placeret.

gav det dig et bedre billede af hvad der er blevet lavet? kan godt indsætte noget kode herinde, men ellers drejer det sig om tre filer som du godt må få over mail.
Det er ikke langt fra, at virker vil jeg mene, men måske er det blevet gjort helt forkert
Avatar billede arne_v Ekspert
03. november 2005 - 00:15 #15
OK så det er spillerne selv som trækker ikke systemet

så er det jo et lidt andet billede
Avatar billede fastpoint Nybegynder
03. november 2005 - 00:16 #16
du siger et lidt andet billede, men det er måske meget?
Avatar billede arne_v Ekspert
03. november 2005 - 00:17 #17
brugerne har auto refresh på

deres requests checker på om det er deres tur ved at at sammenligne
sidst trukket i spil singletin med deres forgænger i session listen
Avatar billede fastpoint Nybegynder
03. november 2005 - 00:22 #18
ikke fuld kode men mini kode til, at give en bedre forståelse ville være rart.

men vores usebean er vel fin nok for den fungere vel som en singleton til det der bliver skrevet ud?
Avatar billede fastpoint Nybegynder
03. november 2005 - 00:30 #19
har sat pointsatsen op så det er klaret

hvordan sætter man en bruger til at auto refreshe ?
Avatar billede arne_v Ekspert
03. november 2005 - 00:32 #20
det er HTML ikke Java - jeg mener at du outputter et META tag med refresh

<meta http-equiv="refresh" content="5">

(husk at fjerne den når han skal trække)
Avatar billede arne_v Ekspert
03. november 2005 - 00:35 #21
en singleton lignende bean delt mellem alle brugerne skal vel have
scope="application"
Avatar billede arne_v Ekspert
03. november 2005 - 00:36 #22
kode vil jeg først kunne skrive engang i morgen - det er ved at være sengetid
Avatar billede fastpoint Nybegynder
03. november 2005 - 07:46 #23
Det er okay:)
Avatar billede fastpoint Nybegynder
03. november 2005 - 11:18 #24
jeg hører man skal bruge application. da den er global
Avatar billede arne_v Ekspert
03. november 2005 - 12:00 #25
du kan godt lave det som web løsning omend det vil være betydeligt mindre
ressource krævende som server app

hvis du skal have 5000 samtidige brugere på, så gør det en forskel !
Avatar billede fastpoint Nybegynder
03. november 2005 - 13:06 #26
et lille kode eksempel på det mest optimale ville være at foretrække:)
Avatar billede fastpoint Nybegynder
03. november 2005 - 13:38 #27
hvordan får man opdateret skærmbilledet hos alle clienter hvis man nu på skift må taste noget tekst ind i en boks. Alle skal kunne se denne tekst
Avatar billede fastpoint Nybegynder
03. november 2005 - 21:37 #28
Det virker som om vi er lidt ud over dit domæne?

kan du forklare denne::

at du har din session listener som gemmer sessionerne i en ArrayList
Avatar billede arne_v Ekspert
03. november 2005 - 23:08 #29
det fik du skelettet til 02/11-2005 23:51:26
Avatar billede arne_v Ekspert
03. november 2005 - 23:10 #30
hvis du vil have en komplet game server som virker godt med 10000 brugere så skal
du nok regne med at skulle betale et 6 cifret beløb ikke point på Eksperten
Avatar billede arne_v Ekspert
03. november 2005 - 23:12 #31
men her kommer et skelet til en web baseret løsning

gamelogin.jsp
=============

<%@ page import="test.Game" %>
<%
if(Game.getInstance().isEnough()) {
    %>
    Beklager ikke flere ledige pladser.
    <%
} else {
    %>
    <form method="post" action="LoginServlet">
    Brugernavn: <input type="text" name="username">
    <br>
    <input type="submit" value="Login">
    </form>
    <%
}
%>

gamemain.jsp
============

<%@ page import="test.Game,java.util.List" %>
<%
if(Game.getInstance().isEnough()) {
    if(session.getAttribute("username").equals(Game.getInstance().playerToMove())) {
        %>
        <form method="post" action="MoveServlet">
        Træk: <input type="text" name="move">
        <br>
        <input type="submit" value="Træk">
        </form>
        <%
    } else {
        %>
        <meta http-equiv="refresh" content="5">
        Venter på <%=Game.getInstance().playerToMove()%>.
        <%
    }
    %>
    <hr>
    Træk:<br>
    <%
    List moves = Game.getInstance().getAllMoves();
    for(int i = 0; i < moves.size(); i++) {
        %>
        <%=(i+1)%> : <%=moves.get(i)%><br>
        <%
    }
} else {
    %>
    <meta http-equiv="refresh" content="5">
    Venter på flere spillere.
    <%
}
%>

web.xml
=======

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>test.LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>MoveServlet</servlet-name>
        <servlet-class>test.MoveServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>MoveServlet</servlet-name>
        <url-pattern>/MoveServlet</url-pattern>
    </servlet-mapping>
</web-app>

LoginServlet.java
=================

package test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Game.getInstance().addPlayer(request.getParameter("username"));
        request.getSession(true).setAttribute("username", request.getParameter("username"));
        response.sendRedirect("gamemain.jsp");
    }
}

MoveServlet.java
================

package test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MoveServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Game.getInstance().doMove(request.getParameter("move"));
        response.sendRedirect("gamemain.jsp");
    }
}

Game.java
=========

package test;

import java.util.ArrayList;
import java.util.List;

public class Game {
    private static Game instance = null;
    private List moves;
    private List players;
    private Game() {
        moves = new ArrayList();
        players = new ArrayList();
    }
    public static synchronized Game getInstance() {
        if(instance == null) {
            instance = new Game();
        }
        return instance;
    }
    public void addPlayer(String player) {
        players.add(player);
    }
    public void doMove(String move) {
        moves.add(move);
    }
    public List getAllMoves() {
        return moves;
    }
    public boolean isEnough() {
        return players.size() == 2;
    }
    public String playerToMove() {
        return (String)players.get(moves.size() % players.size());
    }
}
Avatar billede arne_v Ekspert
03. november 2005 - 23:13 #32
det er ikke kombineret med sessionlistener - den fornøjelse får du
Avatar billede fastpoint Nybegynder
04. november 2005 - 10:28 #33
Den metode du har anvendt er den god hvis der kommer mange online spillere?
koden virker ellers fint

Hvis to brugere logger ind på en sidde og begge køre en bestemt servlet er det så det samme data de arbejder med?
Avatar billede arne_v Ekspert
04. november 2005 - 10:35 #34
op til en vis grænse

hver spiller sender en request hver 5. sekund

250 spillere giver så 50 requests/sekund hvilket bør være OK

derefter går det nok galt

med 250 spillere skal du nok have Game singleton splittet op i en
GameCollection singleton med en Map af Game objects sådan at du kan fordele
f.eks. 4 eller 6 spillere per spil

og så skal du have session listener koblet på for at få folk ud af player
listen

multiplayer spil kræver altså en del kode arbejde
Avatar billede fastpoint Nybegynder
04. november 2005 - 10:36 #35
Har to sidste spørgsmål

1.
public static synchronized Game getInstance() {

hvorfor synchronized?

2.
return (String)players.get(moves.size() % players.size());

hvordan fungere den kodestump?
Avatar billede fastpoint Nybegynder
04. november 2005 - 10:38 #36
2. okay den har jeg gennemskuet. Hvis resten er 0 så er det første spillers tur og ellers er det anden spillers tur
Avatar billede arne_v Ekspert
04. november 2005 - 10:40 #37
det virker også med antal større end 2

med 3:

træk  spiller
0      0
1      1
2      2
3      0
4      1
5      2
Avatar billede arne_v Ekspert
04. november 2005 - 10:41 #38
re 1)

det er for at undgå problemer hvis 2 tråde kalder getInstance samtidigt inden
der er lavet en instans
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