Java服务器套接字问题

Java服务器套接字问题,java,Java,我对Java中的客户机/服务器有问题。这是一个学校项目 我用以下方法打开Java服务器中的套接字: BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter writer = new PrintWriter(new OutputStreamWriter(client.getOutputStream()), true); 我打开客户

我对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,这意味着玩家1开始,直到玩家1结束任务。然后变量改变,它发送P2GO,但是由于一个不清楚的原因,只有客户端1播放器1获得新文本,播放器2、3和4获得文本需要30到40秒。就好像有个瓶颈什么的。然后,当轮到玩家2时,它将花费更长的时间

编辑:

服务器端:

客户端:

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

完整的服务器端代码:


我想你需要一个写信人。在你发邮件后,我会先发一封信。

我总是在写信后发一封信。这就像是如果客户端读取了writer,但它读取了旧文本,但是如果能看到更多的代码(实际发送/接收消息的代码)就好了,你可能会有其他问题..它在编辑下,非常简单,我只需执行write.println,然后执行write.flush。也许我错过了某个地方的睡眠,也许我要为客户快速睡眠的方法是有问题的-你也可能会向你的客户发出大量的请求-睡眠只会在轮到线程再次醒来之前一直睡眠-这可能非常快。看看这里:对于一个基本的多线程服务器。睡眠调用是用来做什么的,它们睡眠了多长时间?我的老师让我把睡眠调用设置为不向fast发送文本,这是一个500毫秒等待的线程。sleep500;'显示服务器端代码。我添加了完整的服务器端代码。服务器中的睡眠调用用于什么?它在读台词时会阻塞,这就足够了吗?
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...
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;
    }
}