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.
ausgeführt wird! Oh Liebes ... Das ist peinlich! Vielen Dank. –
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
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