Почему мое клиент-серверное приложение повторяет ожидаемый результат? - PullRequest
0 голосов
/ 29 марта 2012

У меня возникли проблемы с решением этой проблемы. У меня есть сервер, который получает строку от клиента, первые четыре символа которого являются своего рода «командой». rep: заменяет сохраненную строку, app: добавляет к ней.

Это работает в основном нормально, однако когда я использую команду rep:, она дважды повторяет строку клиента. Итак, если я ввел rep:foo, сервер вернет 'foofoo'. Я попытался проанализировать код и не вижу никаких непосредственных проблем.

При добавлении некоторых тестовых команд вывода как на сервер, так и на клиент, чтобы посмотреть, что содержат переменные, я получаю ожидаемый результат (строка ввода на клиенте минус символы команды). Код для обоих классов ниже:

Сервер:

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;
    }
}

Клиент:

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"));
    }
}

Я действительно не могу понять это, и хотя это не жизненно важно, я хотел бы знать для справки, что происходит неправильно. Так что любые намеки были бы хорошими.

1 Ответ

2 голосов
/ 29 марта 2012

Чувак.

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

видите точку с запятой в конце? :-) Удалите это, и ваши проблемы волшебным образом исчезнут.

отредактировано для добавления: точка с запятой в конце блока else завершает условие, и поэтому код в скобках ниже выполняется при каждой итерации цикла while в ClientHandler2.run()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...