Сокет сервера всегда возвращает ноль клиенту, Java - PullRequest
1 голос
/ 10 февраля 2012

Я, выполняя домашнее задание по компьютерной сети, должен разработать какую-то распределенную СУБД, которые связаны друг с другом одноранговой сетью, поэтому у меня есть TCP-клиент и TCP-сервер в одном .java-файле, который запускается следующим друг другу потоками. TCP-сервер этого класса всегда слушает других TCP-клиентов от других и предоставляет им услуги, проблема в том, что когда я System.out Строка, которую я должен отправить обратно клиенту на стороне сервера, это в пути, который предполагается но после отправки клиент ничего не получает и печатает ноль. Я написал свой код на основе учебных пособий, которые я нашел в сети, и когда я проверял их, они работали хорошо, но это не работает в моем собственном коде. Вы могли бы увидеть, где моя проблема? спасибо

class CommandComp
{
    int PORT = 1210;
    int PORT2 = 1211;
    String IPLocal = "";
    String IPdest = "";
    InetAddress IPAD;
    InetAddress IPAD2;
    int numOfNodes;
    int numOfNodesnonchanged;
    String[] Nodes;
    Random rand = new Random();
    int max = 2000;
    int min = 1000;
    String command;

    Socket clientSocket;

    CommandComp(String[] IPdest, String IPLocal, int numOfNodes, String command)
    {
        try
        {
            this.numOfNodes = numOfNodes;
            numOfNodesnonchanged = numOfNodes;
            this.IPLocal = IPLocal;
            this.Nodes = IPdest;
            this.command = command;
            // this.IPAD = InetAddress.getByName(this.IPdest);
            this.IPAD2 = InetAddress.getByName(this.IPLocal);
            // clientSocket = new Socket(this.IPAD , PORT ,this.IPAD2 , PORT2 );
        }
        catch (Exception e)
        {
            // //e.printStackTrace();
        }
    }

    public String call()
    {

        int i = 0;
        while (numOfNodes > 0)
        {
            String response = "";
            try
            {
                Thread.sleep(rand.nextInt(max - min + 1) + min);
                i = numOfNodes - 1;
                int max2 = 50;
                int min2 = 10;
                this.IPAD = InetAddress.getByName(Nodes[i]);
                clientSocket = new Socket(this.IPAD, PORT, this.IPAD2, PORT2 + rand.nextInt(max2 - min2 + 1) + min2);
                PrintWriter outToServer = new PrintWriter(clientSocket.getOutputStream(), true);
                BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                outToServer.println(command);
                System.out.println(inFromServer.readLine());
                response = inFromServer.readLine();
                outToServer.close();
                inFromServer.close();
                clientSocket.close();
                numOfNodes--;
                System.out.println(Nodes[i] + " Remote DBMS");
                System.out.println(response);

            }
            catch (Exception e)
            {
                e.printStackTrace();
                try
                {
                    clientSocket.close();
                }
                catch (Exception e2)
                {
                    // TODO: handle exception
                }
            }
        }
        return command;
    }
}

class TCPListnerService
    implements Callable<Object>
{    
    String from;

    String to;
    ServerSocket Server;
    String IP = "";
    int numOfNodes;
    int numofNodesUnchanged;
    static clientThread t[];

    TCPListnerService(String IP, int numOfNodes)
    {
        try
        {
            this.IP = IP;
            this.numOfNodes = numOfNodes;
            numofNodesUnchanged = numOfNodes * 2;
            this.t = new clientThread[numofNodesUnchanged];
            InetAddress IPAD = InetAddress.getByName(IP);
            Server = new ServerSocket(1210, 20, IPAD);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public String call()
        throws Exception
    {

        String gotten = "";
        while (numOfNodes > 0)
        {
            Socket connected = Server.accept();

            for (int i = 0; i < numofNodesUnchanged; i++)
            {
                if (t[i] == null)
                {
                    (t[i] = new clientThread(connected)).start();
                    break;
                }
            }
        }
        return gotten;
    }

}

class clientThread
    extends Thread
{

    Socket clientSocket = null;
    sqlite DB = new sqlite();
    String response = "";
    String fromclient;
    String delims = "[ =)(',\n\t\r]+";
    String[] tokens;

    public clientThread(Socket clientSocket)
    {
        this.clientSocket = clientSocket;
    }

    public void run()
    {

        try
        {
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter outToClient = new PrintWriter(clientSocket.getOutputStream(), true);
            fromclient = inFromClient.readLine();

            tokens = fromclient.split(delims);
            if (tokens[0].equalsIgnoreCase("create")
                || tokens[0].equalsIgnoreCase("drop")
                || tokens[0].equalsIgnoreCase("delete")
                || tokens[0].equalsIgnoreCase("insert")
                || tokens[0].equalsIgnoreCase("update")
                || tokens[0].equalsIgnoreCase("select"))
            {
                response = DB.RunQuery(fromclient);
                System.out.println(response);
                outToClient.print(response);
                clientS.close();

            }
            else if (tokens[0].equalsIgnoreCase("shut"))
            {
                System.exit(0);
            }

            inFromClient.close();
            outToClient.close();
            clientSocket.close();
        }
        catch (Exception e)
        {
        }
        ;
    }
}

1 Ответ

2 голосов
/ 10 февраля 2012

Проблема здесь:

inFromClient.close();
outToClient.close();
clientSocket.close();

Вы закрываете (1) входной поток, который закрывает сокет, (2) PrintWriter, который очищает его и закрывает сокет, и (3) сокет. Очевидно, что (2) не может быть успешным, если сокет уже закрыт. Данные, которые вы отправили клиенту, по-прежнему буферизуются, никогда не сбрасываются, поэтому никогда не отправляются.

Просто закройте PrintWriter и закройте сокет в блоке finally в случае сбоя (2). Нет необходимости закрывать вход вообще.

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