/ / Programowanie prostej gry Java Socket Server z multiClients - java, gniazda, serwer, gry 2d

Programowanie prostej gry Java Socket Server z multiClients - java, gniazda, serwer, gry 2d

Próbuję napisać prostą aplikację Java z MultiClient Server. Moje pierwsze kroki były udane. Napisałem proste aplikacje, które działają z wieloma klientami w konsoli. Coś jak prosty czat.

Teraz pracuję nad innym, bardziej złożonym projektem. Napisałem prosty program GUI, który ma tablicę z ruchomymi prostokątami. Każdy gracz jest reprezentowany przez swój własny prostokąt, który może poruszać się po planszy. Moim celem jest to, że jeśli inny gracz dołączy do serwera, będę mógł go obserwować na tablicy.

Napisałem również program serwera. Gdy serwer jest uruchomiony, a Player uruchamia aplikację, próbuje połączyć się z serwerem gier. Jeśli połączenie zostanie nawiązane, serwer rozpocznie nowy wątek, który reprezentuje każdego klienta (gracza). Następnie Player otrzymuje identyfikator użytkownika z serwera, a następnie wysyła swój obiekt Player do serwera ArrayList, który przechowuje wszystkie podłączone odtwarzacze.

Do tej pory wszystko jest w porządku, ponieważtransmisja danych między odtwarzaczem a serwerem jest wywoływana tylko raz, w określonej kolejności (pobierz identyfikator użytkownika z serwera, a następnie wyślij obiekt Player do serwera ArrayList).

Mój problem zaczyna się tutaj. Napisałem inne metody serwera i odtwarzacza do wysyłania i odbierania danych.

Główny program ma własną grę z prostym gameloopem. Metody wysyłania i odbierania graczy znajdują się w tej gameloopie.

Na drugiej stronie mam clientThread, który ma również pętlę z metodami wysyłania i odbierania serwerów.

Mam ten Trace stosu po uruchomieniu klienta (gry):

  java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786)
at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:247)
at GUI.GameBoard.sendData(GameBoard.java:193)
at GUI.GameBoard.run(GameBoard.java:74)
at java.lang.Thread.run(Thread.java:745)
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2313)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2326)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2797)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at GUI.GameBoard.getServerData(GameBoard.java:181)
at GUI.GameBoard.run(GameBoard.java:75)
at java.lang.Thread.run(Thread.java:745)

Nie zamykam żadnego gniazda. Chyba problemem może być synchronizacja transferu danych między serwerem a klientem.

Jakieś porady? Może jakiś dobry samouczek (z wysyłaniem obiektów do serwera w pętli)?

Odpowiedzi:

2 dla odpowiedzi № 1
  java.net.SocketException: Socket closed

Ma to dokładnie jedno znaczenie. Zamknąłeś gniazdo, a następnie nadal z niego korzystałeś.

Błąd w kodzie.

Nie zamykam żadnego gniazda.

Tak, jesteś. Być może nie wiesz, że zamknięcie strumienia wejściowego lub wyjściowego uzyskanego z gniazda zamyka drugi strumień i gniazdo.

Chyba problemem może być synchronizacja transferu danych między serwerem a klientem.

Nie ma z tym nic wspólnego.