Avatar billede andreas134 Nybegynder
22. maj 2011 - 01:05 Der er 34 kommentarer og
1 løsning

Java applet multiplayer spil

Jeg vil gerne lave et applet, online, multiplayer spil i java. Og det skal dermed ligge på en webserver.

(jeg har lavet spillet, men det er i vinduer på min egen computer)

Så det skal "bare" laves om til applet og webserver.

I den forbindelse skal der være 2 eller flere applets der skal snakke sammen med serveren.

Mit spørgsmål:
Jeg vil gerne have følgende forklaret:

1) http://www.thatsjava.com/java-socket-programming/231019/

2) http://www.thatsjava.com/java-socket-programming/240446/

-------------------------------------------------------------

1) :
"You will need to read the Network Programming section of the Java Tutorial. You can have a server application running on the same server as the webserver which servers the applet. The java applets can connect to the server and exchange data. The server application will need to be multi-threaded and pass messages between all the client applets."


hvordan gør man det?


2) :
"The limitation with a servlet solution is that the connection is one way from client to server. Thus, your client would need to "poll" the server for updates.
if you use a regular socket connection, then the communication between client and server can be handled asynchronously. Meaning the server can push data to the client without the client first requesting it...
That's the difference. Using Servlets would work, but it will not be acceptable for online games that require quick response as you'd have to poll the servlet too much."


hvordan gør man det?
- hvad er "regular socket connection"?

-------------------------------------------------------------

I forbindelse med at jeg har prøvet at finde en løsning, har jeg kigget lidt på Tomcat webserver og Servlets.

Jeg håber i forstår spørgsmålet.
Avatar billede arne_v Ekspert
22. maj 2011 - 01:15 #1
De to loesninger de snakker om er:

1) plain socket

paa serveren koerer der et separat Java program ved siden af web serveren

denne app bruger ServerSocket klassen til at lytte paa en port

Java applet bruger Socket klassen til at connecte til den port paa server

applet kan sende til server

server kan sende til applet

(server app kan ogsa skrives i C/C++ eller .NET men teksten taler om Java)

2) HTTP

der koerer kun web server paa server

applets bruger (Http)URLConnection klassen til at sende requests til server

applet kan sende til server

server kan IKKE sende til applet

server app vil hvis den laves i Java EE vaere en eller flere servlets

(men server app kan ogsaa laves i PHP eller ASP.NET)
Avatar billede andreas134 Nybegynder
22. maj 2011 - 10:35 #2
Løsning 2 forstår jeg ikke helt. Skriver han ikke at man ikke behøver at sende forespørgsler for at serveren kan svare?
Avatar billede arne_v Ekspert
22. maj 2011 - 21:19 #3
Nej.

Han skriver at client er noed til at polle.
Avatar billede andreas134 Nybegynder
22. maj 2011 - 21:30 #4
ja, men skriver han så ikke en anden løsning hvor client ikke skal det men server kan sende uden forespørgsler
Avatar billede andreas134 Nybegynder
22. maj 2011 - 21:32 #5
"if you use a regular socket connection, then the communication between client and server can be handled asynchronously. Meaning the server can push data to the client without the client first requesting it..."
Avatar billede arne_v Ekspert
22. maj 2011 - 21:41 #6
Jo.

Men det er jo loesning 1 !
Avatar billede andreas134 Nybegynder
22. maj 2011 - 21:44 #7
okay, fedt!

kan du så fortælle mig hvor jeg kan læse om hvordan man gør det rent praktisk, altså løsning 1?.

eller du kan måske selv forklare det.
Avatar billede arne_v Ekspert
22. maj 2011 - 21:51 #8
Hvis du googler paa:

java socket

vil du faa masser af hits.

Jeg kan ogsaa poste noget eksempel kode.

Men husk at den her loesning ikke virker paa et billigt web hotel!
Avatar billede andreas134 Nybegynder
22. maj 2011 - 21:56 #9
hvis du gider poste noget eksempel kode ville jeg blive meget glad.

fordi jeg kan slet ikke gennemskue hvor server skal ligge og hvordan server skal startes.
Avatar billede arne_v Ekspert
22. maj 2011 - 22:00 #10
server er i det tilfaelde bare et helt normal Java program
Avatar billede andreas134 Nybegynder
22. maj 2011 - 22:02 #11
altså en .jar fil?
Avatar billede arne_v Ekspert
22. maj 2011 - 22:04 #12

import java.io.*;
import java.net.*;
import java.util.*;

public class Server {
    public static void main(String[] args) {
        try {
            List lst = new ArrayList();
            ServerSocket ss = new ServerSocket(12345);
            while(true) {
                Socket s = ss.accept();
                ClientHandler cli = new ClientHandler(s, lst);
                cli.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

class ClientHandler extends Thread {
    private Socket s;
    private BufferedReader br;
    private PrintWriter pw;
    private List lst;
    private String user;
    public ClientHandler(Socket s, List lst) {
        try {
            this.s = s;
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            pw = new PrintWriter(s.getOutputStream(), true);
            this.lst = lst;
            user = "not logged in";
            lst.add(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void run() {
        try {
            String line;
            while((line = br.readLine()) != null) {
                if(line.substring(0,6).equals("LOGIN ")) {
                    user = line.substring(6);
                    System.out.println(user + " login");
                } else if(line.substring(0,5).equals("SEND ")) {
                    String msg = line.substring(5);
                    for(int i = 0; i < lst.size(); i++) {
                        ClientHandler cli = (ClientHandler)lst.get(i);
                        if(cli != this) {
                            cli.send(msg);
                            System.out.println(msg + " send to " + cli.user);
                        }
                    }
                } else {
                    System.out.println("Unknown command : " + line);
                }
            }
        } catch (IOException e) {
            // nothing
        } finally {
            lst.remove(this);
        }
    }
    public void send(String msg) {
        pw.println(msg);
    }
}



import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try {
            Socket s = new Socket("localhost", 12345);
            PrintWriter netpw = new PrintWriter(s.getOutputStream(), true);
            BufferedReader netbr = new BufferedReader(new InputStreamReader(s.getInputStream()));
            PrintWriter conpw = new PrintWriter(System.out, true);
            BufferedReader conbr = new BufferedReader(new InputStreamReader(System.in));
            ServerHandler srv = new ServerHandler(conpw, netbr);
            srv.start();
            netpw.println("LOGIN " + args[0]);
            String line;
            System.out.print("Indtast text (afslut med CTRL/Z): ");
            while((line = conbr.readLine()) != null) {
                netpw.println("SEND " + line);
                System.out.print("Indtast text (afslut med CTRL/Z): ");
            }
            netbr.close();
            netpw.close();
            s.close();
            srv.interrupt();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ServerHandler extends Thread {
    private BufferedReader br;
    private PrintWriter pw;
    public ServerHandler(PrintWriter pw, BufferedReader br) {
        this.pw = pw;
        this.br = br;
    }
    public void run() {
        try {
            String line;
            while((line = br.readLine()) != null) {
                pw.println(line);
            }
        } catch (IOException e) {
            // nothing
        }
    }
}
Avatar billede andreas134 Nybegynder
22. maj 2011 - 22:05 #13
til at starte med, kan du så ikke forklare/lave en skitse over serveren?
Avatar billede arne_v Ekspert
22. maj 2011 - 22:05 #14
det er nemmest at pakke serveren i en jar fil fremfor at have en hel masse class filer
Avatar billede andreas134 Nybegynder
22. maj 2011 - 22:17 #15
hvordan starter man så serveren og hvor skal den ligge?
Avatar billede arne_v Ekspert
22. maj 2011 - 22:36 #16
du kan jo se paa koden ovenfor
Avatar billede arne_v Ekspert
22. maj 2011 - 22:37 #17
du starter serveren som et background job / service
Avatar billede andreas134 Nybegynder
22. maj 2011 - 22:49 #18
job / service ved jeg ikke hvad er.

jeg tror formuleringen var lidt dum.
det jeg mente var om du ville vise hvor de forskellige filer skal ligge på webserveren.
Avatar billede arne_v Ekspert
22. maj 2011 - 23:05 #19
Du kan ligge jar filen hvor som helst.
Avatar billede andreas134 Nybegynder
22. maj 2011 - 23:08 #20
hvad er background service?
og hvordan bruger man det?
Avatar billede arne_v Ekspert
23. maj 2011 - 00:19 #21
hvilket OS
Avatar billede andreas134 Nybegynder
23. maj 2011 - 08:42 #22
Altså jeg har en xampp på min windows 7 ultimate.
Men jeg har også et webhotel hos One og det er vel på Linux.
Avatar billede arne_v Ekspert
24. maj 2011 - 01:45 #23
Paa din egen Windows PC kan du enten bare starte det med en BAT fil eller wrappe det som en service med noget af det software som findes til det.

Som forklaret i #8 kan du ikke lave den slags paa et web hotel som One.
Avatar billede andreas134 Nybegynder
24. maj 2011 - 22:06 #24
Kender du et godt sted hvor jeg kan finde ud af hvordan man laver bat filer og hvordan man bruger services på en webserver(localhost)?

Jeg har nemlig ikke selv kunne finde noget.
Avatar billede arne_v Ekspert
24. maj 2011 - 23:14 #25
Der er ikke mange ben i at lave en BAT fil med en linie som koerer serveren.

Eksempel:

java -Xmx512m -cp mygame.jar mypackage.MyServer
Avatar billede arne_v Ekspert
24. maj 2011 - 23:15 #26
Der er masser af windows service wrappere til Java.

Bare google:

java windows service wrapper
Avatar billede andreas134 Nybegynder
24. maj 2011 - 23:18 #27
Hvad har du brugt hvis du har lavet noget lignende?
Avatar billede arne_v Ekspert
24. maj 2011 - 23:21 #28
Jeg har altid kunnet noejes med en BAT.
Avatar billede andreas134 Nybegynder
25. maj 2011 - 11:41 #29
Jeg tænker mere på hvilken wrapper du har brugt
Avatar billede arne_v Ekspert
25. maj 2011 - 14:57 #30
Jeg har aldrig brugt nogen af dem selv.

De er ikke noedvendige paa *nix.

Og bruger man Java EE er det container udvikleren der ordner den slags og ikke app udvikleren.
Avatar billede andreas134 Nybegynder
27. maj 2011 - 15:01 #31
Det lyder smart.

så er det måske Java EE jeg skal bruge
Avatar billede arne_v Ekspert
27. maj 2011 - 15:17 #32
En chat server med TCP eller UDP vil skulle implementeres som en JCA adapter.

Det er teknisk set en glimrende loesning.

Men det er ogsaa en meget avanceret loesning rent kodemaessigt. Jeg tror ikke at du vil koere fast.
Avatar billede andreas134 Nybegynder
27. maj 2011 - 15:34 #33
men jeg aner ikke hvordan
Avatar billede arne_v Ekspert
27. maj 2011 - 20:46 #34
Stryg det "ikke". Jeg tror at du vil koere fast.
Avatar billede arne_v Ekspert
06. juni 2011 - 04:06 #35
et svar fra mig
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