1

Java でコンソール クライアント サーバー アプリケーションを作成しようとしています。ソケットを使用して、現在、単純なログイン システムと単純なコマンド システムを使用しています。ログイン システムは機能しているように見えますが、ユーザーが正しい資格情報を入力したかどうかに関係なく、「無効なユーザー名とパスワード」行がクライアントに出力されます。- 接続は確実に機能しています。

ただし、コマンド システムはまったく機能していないように見えます。サーバーがコマンドを受信して​​も、何も送り返していないようです。

私の主な質問は、コマンドを受信したときにサーバーがクライアントに何も送信しないのはなぜですか?

これが私のサーバーです:

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

class TCPServer2
{
public static void main(String argv[]) throws Exception
{


    ServerSocket welcomeSocket = new ServerSocket(6789);
    String[][] Login = {{"MATT","UNCP"},{"JOHN","UNCP"},{"CARL","UNCP"}};
    String Command;
    String username;
    String username1;
    String password;
    String password1;
    String cmd;
    while(true)
    {
        Socket connectionSocket = welcomeSocket.accept();
        BufferedReader inFromClient =
           new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
        username = inFromClient.readLine();
        System.out.println("\nUsername received: " + username);
        password = inFromClient.readLine();
        System.out.println("\nPassword received: " + password);
        username1=username.toUpperCase();
        password1=password.toUpperCase();


        for(int i = 0; i<Login.length; i++)
        {
            if(Login[i][0].equals(username1) && Login[i][1].equals(password1))
            {
                outToClient.writeBytes("Hello " + username1);
                outToClient.writeBytes("\nOther users registered on the server currently include: \n");

                for(int k = 0; k<Login.length; k++)
                {
                    outToClient.writeBytes(Login[k][0]);
                    }
            }
            else {
                outToClient.writeBytes("Invalid Username and/or password.\n");
            }
            }
                        BufferedReader inFromClient2 =
           new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        DataOutputStream outToClient2 = new DataOutputStream(connectionSocket.getOutputStream());
        Command = inFromClient2.readLine();
        System.out.println("\nCommand received: " + Command);


if(Command.equals("listTranslations"))
{
outToClient2.writeBytes("English,Thai,Geordie,etc.");
}
else
{
if(Command.equals("getCost"))
{
outToClient2.writeBytes("£100\n");
}
else
{
outToClient2.writeBytes("Invalid Command");
}
}

}

    }
}

これが私のクライアントです:

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

class TCPClient2
{
public static void main(String argv[]) throws Exception
{
     String userName;
     String passWord;
     String loginInfo;
     String loginInfo2;
     String loginInfo3;
     String command;
     String commandInfo;
     String commandInfo2;

     BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
     Socket clientSocket = new Socket("localhost", 6789);
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

     System.out.println("Username: ");
     userName = inFromUser.readLine();
     outToServer.writeBytes(userName + "\n");

     System.out.println("Password: ");
     passWord = inFromUser.readLine();
     outToServer.writeBytes(passWord + "\n");

     loginInfo = inFromServer.readLine();
     System.out.println(loginInfo);
     loginInfo2 = inFromServer.readLine();
     System.out.println(loginInfo2);
     loginInfo3 = inFromServer.readLine();
     System.out.println(loginInfo3);

     System.out.println("Please enter a command: ");
     command = inFromUser.readLine();
     outToServer.writeBytes(command);

     commandInfo = inFromServer.readLine();
     System.out.println(commandInfo);
     commandInfo2 = inFromServer.readLine();
     System.out.println(commandInfo);



     clientSocket.close();
 }
}

スタックオーバーフローで質問するのはこれが初めてですが、過去に何度も閲覧しました。ですから、あなたが提供する素晴らしいコミュニティにも感謝したいと思います。

4

2 に答える 2

0

これが役立つかどうかはわかりませんが、実際にクライアントにデータを出力するために writeBytes を呼び出すたびにフラッシュする必要がないかどうかを確認してください。

outToClient.flush(); を追加してみてください。

于 2012-05-09T13:11:53.300 に答える
0

これは私のコメントからの続きです:

これは私が行う方法です。まず、これを次のString[][] Login = {{"MATT","UNCP"},{"JOHN","UNCP"},{"CARL","UNCP"}};ように置き換えます。

Map<String, String> userDetails = new HashMap<String, String>();
userDetails.put("MAT", "UNCP");
userDetails.put("JOHN","UNCP"); 
userDetails.put("CARL", "UNCP");

次に、これの代わりに:

 for(int i = 0; i<Login.length; i++)
        {
            if(Login[i][0].equals(username1) && Login[i][1].equals(password1))
            {
                outToClient.writeBytes("Hello " + username1);
                outToClient.writeBytes("\nOther users registered on the server currently include: \n");

                for(int k = 0; k<Login.length; k++)
                {
                    outToClient.writeBytes(Login[k][0]);
                    }
            }
            else {
                outToClient.writeBytes("Invalid Username and/or password.\n");
            }
        }

私はこれを行います:

if (userDetails.get(username1).equals(password1))
{
    outToClient.writeBytes("Hello " + username1);
                outToClient.writeBytes("\nOther users registered on the server currently include: \n");

    for (String str : userDetails.keySet()
    {
         outToClient.writeBytes(str);
    }

}
else
{
    outToClient.writeBytes("Invalid Username and/or password.\n");
}

私が見ている方法では、システムは機能しており、Invalid credentials文字列を出力しているため、これらのログインの詳細を提供すると仮定するCARLUNCP、資格情報の2番目のセットを渡しているため、ループは資格情報とそれらを比較して資格情報をチェックします最初のセットであり、それらが一致しないため、メッセージが出力されます。2 回目の繰り返しで、資格情報が一致し、ログインすることがわかります。

詳細については、JavaDocを参照してください。HashMap は、通常のListとに加えて、知っておくと便利なコレクションSetです。

于 2012-05-09T13:23:13.330 に答える