Netzwerkfähiges Spiel



  • Jodocus schrieb:

    Hi schrieb:

    Wenn beide Geräte per Mobilfunk am Internet sind, brauchst du wahrscheinlich nichts weiter zu tun, da du dann zwei public IPs hast (Wobei ich schon davon gehört habe, dass Provider mehreren Kunden die gleiche IP geben, dann müsstest du wohl mal den Support anrufen. Stichwort: carrier-grade NAT).

    Dann wird's erst richtig kompliziert meinst du. CGNs sind auch noch symmetrisch, d.h. NAT-Traversal wird sehr schwer.

    Ein Kumpel aus Tschechien hatte mal das Problem, als er einen Gameserver hosten wollte. Sein Provider hat ihm auf Anfrage tatsächlich eine public IP zugewiesen.



  • Ich schreibe grad den client und hab da so ein kleines codestück aus dem Internet etwas angepasst. Aus irgendeinem Grund kann mein Client nur ein einziges Mal senden. Und das trotz der while Schleife. Ich versteh das nicht.
    clientSocket.close() hab ich auch auskommentiert.

    public class Client {
    
    	public void start() throws Exception
    	{
    		  String sentence;
    		  String modifiedSentence;
    		  BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
    		  Socket clientSocket = new Socket("localhost", 6770);
    		  DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    		  BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    		  while(true)
    		  {
    			  System.out.println("Client starts");
    			  sentence = inFromUser.readLine();
    			  outToServer.writeBytes(sentence + '\n');
    			  modifiedSentence = inFromServer.readLine();
    			  System.out.println("FROM SERVER: " + modifiedSentence + "\n");
    			  //clientSocket.close();
    		  }	  
    	}
    }
    


  • Ihh, C# 🙂

    Äh, naja, readLine() wartet wohl auf Datenempfang.

    Empfängt sentence.
    Sendet sentence + Zeilenumbruch.
    Empfängt modSentence.
    Gibt aus modSentence.

    Damit erneut gesendet wird, muss also erst mal was empfangen werden. readLine() ist nämlich bestimmt ein blocking call.



  • Das ist java. Und klar nach dem ersten Senden des Clients , kommt natürlich was vom Server zurück. Wenn ich dann wieder senden möchte, dann gehts nicht...



  • Doppel-Ihh, Java 🤡

    Dann zeig mal deinen Code.



  • Das ist mein Code für den Client. Am Server liegts nicht. Wenn ich den Client wieder neu starte dann kommt auch wieder was vom Server zurück.



  • Peter_mueller12 schrieb:

    Am Server liegts nicht.

    Warum bist du dir da so sicher?
    Bei diesem Code muss der Server erst mal was senden, damit der Client was zurücksendet.



  • Ich tippe mal darauf, dass der Server kein Newline sendet.



  • Im Zweifel wer was sendet einfach mit Wireshark gucken.



  • Das ist der Server Code . Und ja dieses new Line das macht wohl Probleme. Warum eigentlich frag ich mich da. Aber das löst das Problem trotzdem noch nicht..

    String clientSentence="";
            String capitalizedSentence;
            ServerSocket welcomeSocket = new ServerSocket(6770);
    
            while(true)
            {
               Socket connectionSocket = welcomeSocket.accept();
               BufferedReader inFromClient =
                  new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
               DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
               clientSentence = clientSentence + inFromClient.readLine();
               System.out.println("Received: " + clientSentence);
               capitalizedSentence = clientSentence + '\n';
               System.out.println(capitalizedSentence);
               outToClient.writeBytes(capitalizedSentence); 
            }
    


  • Weißt du überhaupt, was der Code macht? Scheinbar nicht.

    Dieses .accept() ist bestimmt auch ein blocking call. Somit wartet der Server in jedem Schleifendurchgang immer erst auf eine neue Verbindung.
    Die kommt aber nur dann zustande, wenn du den Client (neu) startest.
    Also ein Client Neustart (connect->accept), ein Server send.

    Doofer Code. Doofes copy & paste.

    Guck dir an, wie man mit Sockets umgeht.



  • ok . Das hilft mir schon mal weiter 🙂
    Das Grundgerüst für Client , Server kopier ich mir eigentlich immer irgendwo, denn das ist ja eh alles gekapselt und programmiersprachen abhängig.

    Was muss ich denn dann statt dem accept verwenden. Oder kannst du mir mal nen link
    geben. Das mit dem new Line \n versteh ich trotzdem nicht ganz. Das ist wohl das Terminalzeichen für den Server bzw Client um zu senden...



  • Peter_Mueller schrieb:

    Was muss ich denn dann statt dem accept verwenden.

    Die Frage ist doch eher: Was genau willst du eigentlich machen?

    Ich würd mal bei 0 anfangen und nen eigenen Code schreiben und rumprobieren.



  • Warum find ich im Netz kein Client / Server Beispiel wo sowohl der Client als auch der Server beliebig oft senden und empfangen kann. Da muss man ja nicht mal nen extra Thread aufmachen oder...



  • Bau halt ne for-Schleife ein.



  • Programmieren != passendes Beispiel Suchen und leicht Anpassen.
    Lern Programmieren.



  • hustbaer schrieb:

    Programmieren != passendes Beispiel Suchen und leicht Anpassen

    Dochdoch.. so hab ich jedenfalls begonnen 😃

    Man muss sich halt zu helfen wissen, sprich trial & error. Aber wenn's schon an der Suchmaschine scheitert.. :p


  • Mod

    Hi schrieb:

    Man muss sich halt zu helfen wissen, sprich trial & error.

    Kennst du diese C-Programmierer, deren Code zwar nicht falsch, aber auch nicht richtig ist? 😃

    Aber wenn's schon an der Suchmaschine scheitert.. :p

    Wohl wahr.



  • Ich komm mit meinem Spiel voran. So jetzt bin ich im Hotel und habe meinen Laptop und mein Android Phone bei mir. Der Laptop hat 192.168.11.41 und das Phone 192.168.11.55 als IP . Erstaunlicherweise kann ich beide vom jeweils anderen Gerät nicht pingen. Ich wollte auf meinem Laptop den Client laufen lassen und hab das Phone als Server laufen lassen und das geht jetzt natürlich nicht. Was soll ich jetzt machen ? Unterbindet der Router im Hotel vielleicht das pingen ? Wahrscheinlich oder. Aus Sicherheitsgründen da man sonst andere Hotelgäste belästigen könnte. Wie kann ich meine Anwendung nun testen. Öffentliche IP meines Hotels ist 87.128.16.39 . Aber die hilft mir nicht oder...



  • Peter_Mueller schrieb:

    Unterbindet der Router im Hotel vielleicht das pingen ?

    Kann schon sein. Oder die Firewalls deiner Geräte.

    Du brauchst aber doch bestimmt keinen Ping für dein Spiel.


Anmelden zum Antworten