我的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;
}
}
答案 0 :(得分:-1)
发送消息后,我认为您需要writer.flush()
。