Java服务器套接字问题

时间:2011-05-26 23:43:29

标签: java

我的Java客户端/服务器有问题。这是一个学校项目。

我使用以下命令打开Java服务器中的套接字

BufferedReader reader =
    new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter writer =
    new PrintWriter(new OutputStreamWriter(client.getOutputStream()), true);

我在客户端(4个客户端,每个客户端1个线程)打开套接字:

BufferedReader reader =
    new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer =
    new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

我收到同步错误。让我解释一下。

服务器正在向所有客户端发送文本"J1GO"(这意味着"Player 1 go"),直到播放器1结束任务。然后变量发送,它发送"P2GO",但由于一个不明原因,只有客户端1(播放器1)获取新文本,并且需要30到40秒,直到玩家2,3和4获得文本。这就像是存在瓶颈或其他东西。 (然后,当它在第2轮播放时,它将花费更长的时间!)


修改

服务器端:

if (ligne.contains("Attente"))
{
    writer.println("J"+Serveur.PlayerTurn+ "GO"); // (J1-2-3-4GO)

    writer.flush();

客户端:

if (Deplacement)
{
    sleep();
    writer.println("Attente");
    writer.flush();
    String ligne = reader.readLine();
    System.out.println(ligne);
    int Coup = 99;
    if (!Question)
    {
        if (!ligne.contains(IamPlayer +"GO")) //J1-2-3-4GO
        {

            sleep();
            writer.println("Attente");
            writer.flush();


        }
        else // go on...

我将解释如何在服务器之间进行交换。当游戏开始时,服务器向所有客户端发送"J1GO"Player1客户端读取它,然后开始游戏。其他客户阅读它,但他们没有启动游戏,他们发送"Waiting...",当服务器获得"Waiting.."时,他发送"J1GO",所以当它Player2时转,服务器将发送J2GO,因此Player2将启动游戏,Player1将返回等待模式


完整的服务器端代码:

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



public class Serveur
{
    public static int NombreJoueurs = 1;
    public static boolean Debut = false;
    public static Joueur J1 = new Joueur();
    public static  Joueur J2 = new Joueur();
    public static Joueur J3 = new Joueur();
    public static Joueur J4 = new Joueur();
    public static ConnectionBD BD = new ConnectionBD();
    public static boolean Pret = false;
    public static String TourJoueur = "1";
    public static String NumeroQuestion = null;
    public static boolean PretAJouer()
    {
        if (Pret)
            Pret=false;
        else
            Pret = true;
        return Pret;
    }
    public static void AjouterJoueur()
    {
        NombreJoueurs = NombreJoueurs+1;
    }
    public void servir( int port )
    {
        try
        {

            ServerSocket serveur = new ServerSocket( port );
            System.out.println( "Serveur echo en ligne" );

            System.out.println(Serveur.BD.VerifierReponse("V04B"));

            boolean enService = true;
            while ( enService )
            {
                Socket client = serveur.accept();
                System.out.println( "Client connecte" );


                // pour chaque nouvelle connexion on crée un thread qui prend en
                // charge les échanges avec le client
                Connexion connexion = new Connexion( client );
                new Thread( connexion ).start();
            }
        }
        catch ( Exception e )
        {
            System.err.println( e );
        }
    }



    public static void main(String[] args)
    {
        new Serveur().servir( 1337 );
    }
}

class Connexion implements Runnable
{


    Socket client;

    Connexion( Socket client )
    {
        this.client = client;
    }

    // thread qui s'occupe des échanges avec un client
    public void run()
    {
        try
        {
            BufferedReader reader =
                new BufferedReader(
                new InputStreamReader( client.getInputStream() ) );

            PrintWriter writer =
                new PrintWriter(
                new OutputStreamWriter( client.getOutputStream() ), true );

            boolean fini = false;
            while ( ! fini )
            {
                String ligne = null;
                ligne = reader.readLine();
                //System.out.println(ligne);
                //System.out.println("RECEPTION CLIENT:"+ligne);
                //création de joueur, le client doit envoyer NewJoueur: Vincent,Matte
                //le numéro est attribuer par un variable incrémentable sur le serveur
                if (ligne.startsWith("NewJoueur"))
                {
                    String temp = Nettoyer(ligne);
                    String Nom = temp.substring(0,temp.indexOf(","));
                    String Pseudo = temp.substring(temp.indexOf(",")+1, temp.length());
                    if (Serveur.NombreJoueurs == 1)
                    {
                        Serveur.J1.SetNom(Nom);
                        Serveur.J1.SetPseudo(Pseudo);
                        writer.println("J1");
                        writer.flush();
                    }                    else if (Serveur.NombreJoueurs == 2)
                    {
                        Serveur.J2.SetNom(Nom);
                        Serveur.J2.SetPseudo(Pseudo);
                        writer.println("J2");
                        writer.flush();

                    }                    else if (Serveur.NombreJoueurs == 3)
                    {
                        Serveur.J3.SetNom(Nom);
                        Serveur.J3.SetPseudo(Pseudo);
                        writer.println("J3");
                        writer.flush();

                    }                    else if (Serveur.NombreJoueurs == 4)
                    {
                        Serveur.J4.SetNom(Nom);
                        Serveur.J4.SetPseudo(Pseudo);
                        writer.println("J4");
                        writer.flush();
                    }
                    if (Serveur.NombreJoueurs > 4)
                    {
                        writer.println("ERREUR: Trop de joueurs");
                        writer.flush();
                    }                    else Serveur.AjouterJoueur();
                }
                if (ligne.startsWith("Setup?"))
                {
                    if (Serveur.NombreJoueurs <= 4)
                    {
                        writer.println("not ready");
                        writer.flush();
                    }
                    else
                    {
                        writer.println("Setup: " + Serveur.J1.GetPseudo() + "," + Serveur.J2.GetPseudo() + "," + Serveur.J3.GetPseudo() + "," + Serveur.J4.GetPseudo());
                        writer.flush();
                    }
                }
                if (ligne.contains("Attente"))
                {
                    writer.println("J"+Serveur.TourJoueur + "Deplacement");
                    writer.flush();
                    Pr("J'envoie:"+ "J"+Serveur.TourJoueur + "Deplacement");
                    if (ligne.contains("AttenteQuestion")) //On recoit J2AttenteQuestion: V
                    {
                        if (ligne.contains("J"+Serveur.TourJoueur))
                        {
                            String Categorie;
                            String Question;
                            Categorie = ligne.substring(ligne.indexOf(":")+1, ligne.length());

                            Question = Serveur.BD.ObtenirQuestion(Categorie);//Envoie V pour vert, J pour Jaune .. etc..
                            //Exemple de reponse... J2: V03: Quel homme a marcher sur la terre? |A[Vincent matte] B[....

                            writer.println("DonneQuestions : " + Question );
                            writer.flush();
                        }
                        else
                        {
                            try
                            {
                                Thread.sleep(2000); // do nothing for 1000 miliseconds (1 second)
                            }
                            catch (InterruptedException e)
                            {
                                e.printStackTrace();
                            }
                            //Pr(ligne);
                            writer.println("not ready");
                            writer.flush();
                        }
                    }
                }
                if (ligne.startsWith("Reponse")) //Recoit ReponseJ1:V03A
                {
                    String Reponse = ligne.substring(ligne.indexOf(":") +1, ligne.length()); // V03A
                    String Question = ligne.substring(ligne.indexOf(":"), (ligne.length()-1)); //V03
                    String CategorieString = ligne.substring(ligne.indexOf(":"), (ligne.indexOf(":")+1));
                    char Categorie = CategorieString.charAt(0);
                    boolean BonneReponse = false;
                    System.out.println("Contenu de la reponse (de la methode)" + Serveur.BD.VerifierReponse(Reponse));
                    if (Serveur.BD.VerifierReponse(Reponse).contains("Y"))
                        BonneReponse = true;
                    else
                        System.out.println("Le joueur a mal repondu");

                    //boolean BonneReponse = Serveur.BD.VerifierReponse(Reponse);
                    if (BonneReponse)
                    {
                        System.out.println("Le joueur a bien repondu");
                        //Serveur.BD.SetQuestionRepondue("Y", Question);
                        //Serveur.BD.AjouterScore(Categorie, Question);
                        //String Score = Serveur.BD.GetScore// (envoyer pseudo en string et retourne un score
                        // writer.println(Serveur.TourJoueur + ": " + "bravo" + "("+ Score +")");
                        //mettre tour joueur = J +1;
                        if (Serveur.TourJoueur.equals("4"))
                        {
                            Serveur.TourJoueur = "1";
                        }
                        else
                        {
                            int temp = Integer.parseInt(Serveur.TourJoueur);
                            temp++;
                            Serveur.TourJoueur = Integer.toString(temp);
                            System.out.println("Le joueur + " + Serveur.TourJoueur + " peut maintenant joué");
                        }
                    }
                    else
                    {
                        writer.println(Serveur.TourJoueur + ": " + "fail");
                        writer.flush();
                        if (Serveur.TourJoueur.equals("4"))
                        {
                            Serveur.TourJoueur = "1";
                        }
                        else
                        {
                            int temp = Integer.parseInt(Serveur.TourJoueur);
                            temp++;
                            Serveur.TourJoueur = Integer.toString(temp);
                            System.out.println("Le joueur + " + Serveur.TourJoueur + " peut maintenant joué");
                        }

                    }
                }
            }

            reader.close();
            writer.close();
            client.close();
        }
        catch ( IOException ioe )
        {
            /*
             * Ici on choisit de quitter l'application, mais il y aurait peut-être
             * moyen de traiter l'exception.
             */
            System.err.println( "Erreur d'entre-sortie" );
            System.exit( 1 );
        }
    }

    public void Pr(String pr)
    {
        System.out.println(pr);
    }
    public String Nettoyer(String Crap)
    {
        //Enleve n'importe quoi devant.. ex Lol: blabla, devient Blabla
        int index = Crap.indexOf(":");
        index++;
        String Propre = Crap.substring(index, Crap.length());
        return Propre;
    }
}

1 个答案:

答案 0 :(得分:-1)

发送消息后,我认为您需要writer.flush()