6

クライアントが接続して推測ゲームをプレイし、これを行うことでポイントを獲得するサーバーを作成しています。

現時点での私の唯一の問題は、クライアントが数字を正しく推測すると、サーバーにジャンプして「server null」と表示されることです。クライアントが「さようなら」を入力するまで、推測ゲームを続行したいと思います。これにより、スコアが与えられます。

これが私のコードです。どこが間違っているかを指摘し、私が望むものをどのように達成するかについてアドバイスしてください。問題はプロトコルにあると思います。おそらく、while を正しい場所に配置する必要があるだけなので、それが最初です。ありがとう!追加するために、変数の名前が奇妙です.これは以前はノックノックジョークサーバーだったことを認識しています.

プロトコル

import java.util.*;

        public class KKProtocol {
    int guess = 0, number = new Random().nextInt(100) + 1;
    int score = 0;
    Scanner scan = new Scanner(System.in);


    public String processInput(String theInput) {
        String theOutput = null;

        System.out.println("Please guess the number between 1 and 100.");

        while (guess != number) {
          try {
            if ((guess = Integer.parseInt(scan.nextLine())) != number) {
              System.out.println(guess < number ? "Higher..." : "Lower...");
            }
            else {
              System.out.println("Correct!");
              score = 1;
            }
          }   
          catch (NumberFormatException e) {
            System.out.println("Please enter a valid number! If you want to Quit just say'Goodbye'");
          }   

        }   



        return theOutput;   
    }}

サーバ

import java.net.*;
import java.io.*;

public class KKServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        boolean listening = true;
        try {
            serverSocket = new ServerSocket(4040);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4040.");
            System.exit(-1);
        }
        System.err.println("Started KK server listening on port 4040");
        while (listening)  
            new KKThread(serverSocket.accept()).start();
            System.out.println("Accepted connection from client");
            serverSocket.close();
        }
}

スレッド

import java.net.*;
import java.io.*;
import java.util.Scanner;

public class KKThread extends Thread {
    private Socket mySocket = null;

    public KKThread(Socket inSocket) {           //super("KKThread");
        mySocket = inSocket;
    }
    public void run() {

        try {
            PrintWriter out = new PrintWriter(mySocket.getOutputStream(), true);
            Scanner in = new Scanner(mySocket.getInputStream());

            String inputLine, outputLine;
            KKProtocol kkp = new KKProtocol();

            outputLine = kkp.processInput(null);        // first time only
            out.println(outputLine);        // (Should be "Knock Knock")

            while (true) {
                inputLine = in.nextLine();                  // read in client input
                outputLine = kkp.processInput(inputLine);   // get reply from protocol
                out.println(outputLine);                    // send it out to socket
                if (outputLine.equals("Bye"))
                    break;
            }
            out.close();
            in.close();
            mySocket.close();

        } catch (Exception e) {
            System.err.println("Connection reset");  //e.printStackTrace();
        }
    }
}

クライアント

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class KKClient {
    public static void main(String[] args) throws IOException {

        Socket kkSocket = null;
        PrintWriter out = null;
        Scanner in = null;

        try {
            kkSocket = new Socket("127.0.0.1", 4040);
            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new Scanner(new InputStreamReader(kkSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection");
            System.exit(1);
        }
        Scanner stdIn = new Scanner(System.in);
        String fromServer = in.nextLine();
        while (true) {
            System.out.println("Server: " + fromServer);
            if (fromServer.equals("Bye."))
                break;
            out.println(stdIn.nextLine());
            fromServer = in.nextLine();
        }
        out.close();
        in.close();
        stdIn.close();
        kkSocket.close();
    }
}
'

サーバーにジャンプして「server null」と表示されるのはなぜですか? クライアントが「さようなら」と入力するまで推測を続けるにはどうすればよいですか?

4

2 に答える 2

2

score現在、 inのサーバー応答を割り当てていないKKProtocol.processInput()ため、代わりに anullが返され、次のメッセージが表示されます。

Server: null

あなたが使用することができます:

theOutput = Integer.toString(score);

また、あなたscoreはに固定されて1いるので、おそらく使用された推測の数に基づいて採点システムを考案したいと思うかもしれません.

于 2012-12-16T16:15:32.087 に答える
1

メソッドでは、値をprocessInput()返すのではなく、常にnull. その null 値は、出力時に文字列「null」に変換され、クライアントに送信されるようです。

于 2012-12-16T16:16:15.423 に答える