1

Java でコーディングされた基本的なサーバーとクライアントがあります。これは私がインターネットで見たコードで、私のニーズに合わせて少し修正しました。さて、私は基本的にクライアントからサーバーにメッセージを送信しています。このメッセージは「こんにちは」です。サーバーはポート 6789 で「hello」という単語を含むメッセージをチェックし、それが正しい場合は、特定のディレクトリ内のすべてのファイル/サブディレクトリの名前を取得する必要があります。これらの名前の最初の名前がクライアントに送り返され、クライアントはそれを印刷します。ポート 6789 を開き、クライアントからサーバーへのメッセージの送信は完全に機能します。サーバーはそれを受け取り、必要なアクションを実行しますが、データをクライアントに送り返しません。クライアントが受信していないのか、サーバーが送信していないのかわかりません。両方のコードは次のとおりです。

クライアント

    String sentence = "hello";
    Socket clientSocket = new Socket("localhost", 6789);
    DataOutputStream outToServer = new DataOutputStream(
            clientSocket.getOutputStream());
    outToServer.writeBytes(sentence + '\n');
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
            clientSocket.getInputStream()));
    System.out.println(inFromServer.readLine());
    clientSocket.close();

サーバ

    String sentence;
    ServerSocket welcomeSocket = new ServerSocket(6789);

    while (true) {
        Socket connSocket = welcomeSocket.accept();
        BufferedReader inFromClient = new BufferedReader(
                new InputStreamReader(connSocket.getInputStream()));
        sentence = inFromClient.readLine();
        if (sentence.contains("hello")) {
            File dir = new File("D:/ServerMap/");
            String[] children = dir.list();
            if (children == null) {
                JOptionPane.showMessageDialog(frame,
                        "Either no directory or it doesn't exist");
            } else {
                DataOutputStream outToClient = new DataOutputStream(
                        connSocket.getOutputStream());
                outToClient.writeBytes(children[0]);
                JOptionPane.showMessageDialog(frame, children[0]);
            }
        }
    }

個別にエクスポートされた Runnable Jar ファイルを使用してサーバーを実行しています。クライアントはコンパイルされ、Eclipse で実行されます。

私の問題を明確にするために:クライアントはサーバーに「hello」を送信します->サーバーはメッセージを受信し、「hello」が含まれているため、ifステートメントはtrueを返します->サーバーは指定されたディレクトリ内のファイル名をチェックし、カップルを見つけます->サーバーは送信します見つかった最初のファイル名を返します->クライアントはそのファイル名を受け取り、Eclipseコンソールに出力することになっています(これは機能しない部分です)

助言がありますか?

PS: これはすべてローカル ホストで行われます。Windows 7 x64の1台のコンピューターで実行され、ポート6789が開いています(手動で開く前はまったく機能しませんでした)。

4

2 に答える 2

3

サーバーのクライアント出力ストリームからデータをフラッシュする必要があります。

outToClient.writeBytes(children[0] + "\n");
outToClient.flush();
// etc.
于 2012-07-21T13:51:59.763 に答える
0

問題は、サーバーが送信しないライン フィード '\n' をクライアントが待機していることです。クライアントには inFromServer.readLine() があり、サーバー側には outToClient.writeBytes(children[0]) があるため、提案されているように outToClient.writeBytes(children[0] + "\n") に変更する必要がありますレイメウス。BufferedReader クラスのメソッド readLine は、「\n」を読み取るまでブロックします。

于 2012-12-23T22:18:40.753 に答える