2011-11-04 3 views
0

J'ai trouvé ce serveur TCP en ligne, je veux le modifier un peu pour retourner un message différent de celui qui a été tapé dans le client. Ça ne marche pas comme je veux; le else {} fonctionne "comme un charme" mais le premier si non - le client attend toujours l'entrée.BufferedReader problème - ne répond pas correctement

server.java

while(true) 
{ 
Socket connectionSocket = welcomeSocket.accept(); 
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
clientSentence = inFromClient.readLine(); 
System.out.println("Received: " + clientSentence); 
String test="hey"; 
String tempus="tster"; 
if(clientSentence.contains(test)==true){ 
System.out.println(tempus); 
outToClient.writeBytes(tempus); 
} 
else{ 
capitalizedSentence = clientSentence.toUpperCase() + '\n'; 
outToClient.writeBytes(capitalizedSentence); 
} 

client.java

public static void main(String argv[]) throws Exception 
{ 
String sentence; 
String modifiedSentence; 
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
Socket clientSocket = new Socket("localhost", 6789); 
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
sentence = inFromUser.readLine(); 
outToServer.writeBytes(sentence + '\n'); 
modifiedSentence = inFromServer.readLine(); 
System.out.println("FROM SERVER: " + modifiedSentence); 
clientSocket.close(); 
} 

Répondre

2

Une erreur courante lors de la lecture/écriture dans les fichiers/socket est de mélanger et de faire correspondre le texte avec bina ry et devenir horriblement confus. Vous avez utilisé les deux.

Vous devez utiliser du texte ou du code binaire, il semble que vous vouliez utiliser du texte. par exemple. BufferedReader et PrintWriter. (Remarque: PrintWriter consomme silencieusement des exceptions dans le flux sous-jacent)

0

Dans le BufferedReader vous attendez une ligne, ce qui est indiqué par le \n à la fin, comme vous l'avez fait dans le else. Si vous voulez utiliser readLine, vous devez envoyer une ligne (qui se termine par le nouveau caractère de ligne - \n

Si vous ne souhaitez pas ajouter un nouveau caractère de ligne à la fin de l'entrée, vous pouvez utiliser la méthode BufferedReader#read(char[],int,int)

0

BufferedReader.readLine() essaie de lire une ligne entière d'entrée (c'est-à-dire qu'elle recherche le caractère de nouvelle ligne '\ n'). Votre chaîne dans le bloc "else" ajoute la nouvelle ligne à la fin alors que votre variable tempus n'est pas terminée avec un retour à la ligne, le client attend simplement