0

こんにちは、出力ストリームに正常に出力されるソケット クライアントがあります。サーバーはそれを取得し、出力ストリームで応答文字列を返そうとします。readLine()ただし、クライアントのメソッドでデバッグ トリガーを確認できるにもかかわらず、応答がクライアントに到達することはありません。

クライアント側のスニペット

       protected static BufferedReader getClientInputChannel() {
            BufferedReader inFromServer = null;
            try {
                if (clientSocket != null)
                    clientSocket = new Socket(TPS_HOST, TPS_PORT);
                inFromServer = new BufferedReader(new InputStreamReader(
                        clientSocket.getInputStream()));
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            return inFromServer;
        }


        if (query != null && !query.isEmpty()) {                
                    System.out.println("RetrievalSystem: send query: " + query);
                    outToServer.println(query);
                    String response = getClientInputChannel().readLine();
                    System.out.println("RetrievalSystem: response from TPS: " + response);
                    // Close the output stream.
                    outToServer.close();
                }

サーバ側。

package com.ds;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

public class TextProcessingServer extends Thread {
    protected final static int DEFAULT_TPS_PORT = 8081;

    protected int port;

    public TextProcessingServer(int defaultTpsPort) {
        setPort(defaultTpsPort);
    }

    public TextProcessingServer() {
        setPort(DEFAULT_TPS_PORT);
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    @Override
    public void run() {
        init();
    }

    /**
     * single threaded query consumer.
     */
    protected void init() {
        System.out.println("Initializing TPS Server.");
        ServerSocket serverSocket = null;
        Socket clientSocket = null;
        try {
            serverSocket = new ServerSocket(getPort());
            clientSocket = serverSocket.accept();

            // set up the read and write end of the communication socket
            BufferedReader inFromClient = new BufferedReader(
                    new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter outToClient =
                    new PrintWriter(clientSocket.getOutputStream(), true); 

            // retrieve first line of request and set up for parsing
            String requestMessageLine = inFromClient.readLine();

            while (requestMessageLine.length() > 0) {
                System.out.println("TPS SERVER: Incoming request: " + requestMessageLine);
                // Send reply       
                    // THIS REPLY NEVER REACHES THE CLIENT.
                outToClient.println(queryInvertedIndex(requestMessageLine));
                // Now, listen again for the next incoming request.
                requestMessageLine = inFromClient.readLine();
            }

            System.out.println("left client listening mode.");

        } catch (IOException e) {
            System.out
                    .println("Exception caught when trying to listen on port "
                            + getPort() + " or listening for a connection");
            System.out.println(e.getMessage());
        } finally {
            try {
                clientSocket.close();
                serverSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public String queryInvertedIndex(String queryString) {
        InvertedIndex invIdx = InvertedIndex.getInstance();
        // There could be multiple query strings, thus split.
        // Also handle html encoded strings: pigs%20fly
        String queryStrings[] = queryString.split("%20|\\s");
        StringBuilder resultList = new StringBuilder();
        for (String key : queryStrings) {
            List<Integer> partialResultList = invIdx.get(key);
            for (Integer lineNumber : partialResultList)
                resultList.append(lineNumber.toString() + " ");
            resultList.replace(resultList.length() - 1, resultList.length(),
                    ", ");
        }
        // Remove the last comma.
        if (resultList.length() > 0)
            resultList = new StringBuilder(resultList.substring(0,
                    resultList.length() - 2));
        else
            resultList = new StringBuilder("[NO_RESULT]");
        return resultList.toString();
    }

}
4

2 に答える 2

0

出力ストリームをフラッシュするのを忘れていると思います。

outToClient.flush();

それを試してみてください..

于 2013-10-22T11:07:40.337 に答える
0

解決しました。それはあなたが見ることができなかったものです。静的クラスからサーバーを呼び出しました。クラスを静的メソッドのない非静的クラスに変更すると役立ちました。

于 2013-10-22T16:40:41.633 に答える