2012-03-29 3 views
0

Ich habe einige Probleme, dieses Problem herauszufinden. Ich habe einen Server, der eine Zeichenkette von einem Klienten nimmt, dessen die ersten vier Zeichen als ein "Befehl" von Arten fungieren. rep: ersetzt die gespeicherte Zeichenfolge, app: hängt daran an.Warum wiederholt meine Client-Server-App die erwartete Ausgabe?

Dies funktioniert meist gut, aber wenn ich den rep: Befehl verwende, wiederholt es die Zeichenfolge des Clients zweimal. Also, wenn ich rep:foo eingegeben hat, gibt der Server 'foofoo' zurück. Ich habe versucht, den Code zu analysieren und sehe keine unmittelbaren Probleme.

Wenn ich dem Server und dem Client einige Testausgabebefehle hinzufüge, um zu sehen, was die Variablen beinhalten, bekomme ich das Ergebnis wie erwartet (die Eingabe auf dem Client abzüglich der Befehlszeichen). Der Code für beide Klassen ist unter:

Server:

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

public class SynchServer 
{ 
    public static void main(String[] args) throws IOException 
    { 
    ServerSocket serverSocket = null; 
    final int PORT = 1234; 
    Socket client; 
    ClientHandler2 handler; // thread for client 
    int clientCount = 0; 

    //set up server socket 
    try 
    { 
     serverSocket = new ServerSocket(PORT); 
    } 
    catch(IOException ioEx) 
    { 
     System.out.println("Cannot open socket!"); 
     System.exit(1); 
    } 

    // client connections and related actions: 
    do 
    { 
     // wait for client... 
     client = serverSocket.accept(); 
     System.out.println("Client accepted...\n"); 
     // assign client a connection number 
     clientCount++; 
     // create thread 
     handler = new ClientHandler2(client, clientCount); 

     // run thread 
     handler.start(); 
    }while(true); 
    } 
} 

class ClientHandler2 extends Thread 
{ 
    // declare thread variables 
    private Socket client; 
    private Scanner input; 
    private PrintWriter output; 
    private static String text = ""; 
    int clientNum; // picked up from main 

    // constructor - set up socket and streams 
    public ClientHandler2(Socket socket, int clientCount) 
     throws IOException 
    { 
    client = socket; 
    clientNum = clientCount; 
    // streams... 
    // from client 
    input = new Scanner(client.getInputStream()); 
    // to client 
    output = new PrintWriter(client.getOutputStream(), true); 
    } 

    // thread actions: 
    public void run() 
    { 
    String head, tail, received; 

    do 
    { 
     // read in line from client 
     received = input.nextLine(); 
     // split input line in two - head is first four 
     // characters for the command, tail is for rest of 
     // line - the text to be manipulated: 
     head = received.substring(0,4); 
     tail = received.substring(4); 
     // find command and choose relevant method to execute 
     if(head.equals("rep:")) 
     { 
     replaceText(tail); 
     } 
     else if(head.equals("app:")); 
     { 
     appendText(tail); 
     } 
     // no further tests needed - makes server ignore 
     // invalid commands (Add some kind of message?) 

     // send modified (or not) string back to client: 
     output.println(clientNum + ": " + text); 
    }while(!received.equals("QUIT")); 

    // close socket connection 
    try 
    { 
     System.out.println("Closing connection..."); 
     client.close(); 
    } 
    catch(IOException ioEx) 
    { 
     System.out.println("Unable to close connection!"); 
    } 
    } 

    private synchronized void replaceText(String value) 
    { 
    text = value; 
    } 

    private synchronized void appendText(String value) 
    { 
    text += value; 
    } 
} 

Auftraggeber:

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

public class SynchClient 
{ 
    public static void main(String[] args) throws IOException 
    { 
    // declare variables 
    InetAddress host = null; 
    final int PORT = 1234; 
    Socket socket; 
    Scanner networkInput, keyboard; 
    PrintWriter networkOutput; 

    // assign host address: 
    try 
    { 
     host = InetAddress.getLocalHost(); 
    } 
    catch(UnknownHostException uhEx) 
    { 
     System.out.println("Host ID not found!"); 
     System.exit(1); 
    } 

    // Set up socket to server and IO streams: 
    socket = new Socket(host, PORT); 
    // from server 
    networkInput = new Scanner(socket.getInputStream()); 
    // to server 
    networkOutput = 
     new PrintWriter(socket.getOutputStream(),true); 
    // user input 
    keyboard = new Scanner(System.in); 

    String message, response; 

    do 
    { 
     // get user input 
     System.out.print("Enter message ('QUIT' to exit): "); 
     message = keyboard.nextLine(); 
     // validate user input - ensure string is >= 4 chars 
     // long 
     while(message.length() < 4) 
     { 
     System.out.print("Try again: "); 
     message = keyboard.nextLine(); 
     } 
     // send message to server: 
     networkOutput.println(message); 
     // received response from server 
     response = networkInput.nextLine(); 
     // output server response 
     System.out.println(response); 
    }while(!message.equals("QUIT")); 
    } 
} 

Ich kann wirklich nicht dieses heraus, und zwar nicht von entscheidender Bedeutung, würde ich gerne wissen, für referenzieren, was falsch läuft. Also, irgendwelche Hinweise wären nett.

Antwort

2

Alter.

else if(head.equals("app:"));

sehen Sie das Semikolon am Ende dort? :-) Entferne das und deine Probleme sollten magisch verschwinden.

hinzufügen bearbeitet: Das Semikolon am Ende des else Block beendet den Zustand und den Code in den folgenden Klammern somit jede Iteration der while-Schleife Haha in ClientHandler2.run()

+0

ausgeführt wird! Oh Liebes ... Das ist peinlich! Vielen Dank. –

+1

mach dir keine Sorgen, ich habe es auch getan. Es ist wirklich scheiße, wenn du es findest und es ist etwas so triviales :-) – mcfinnigan

+0

Kannst du auch erklären, was falsch ist? Sieht aus wie der Doppelpunkt (nicht Semikolon!) Ist ein Sonderzeichen. Konnte jedoch keine Dokumentation dazu finden. – hcpl

Verwandte Themen