2

TCP クライアント/サーバー プログラムを作成するのはこれが初めてです。クライアント側にユーザ​​ー名とパスワードを要求する単純な Java クライアントおよびサーバー プログラムを作成することになっています。そこから、サーバーはユーザー データベース (多次元配列を使用して作成しようとしました) をチェックして、一致があるかどうかを確認し、クライアントに "Hello " (ユーザー名) というメッセージを返し、ユーザーに他のすべてのことを伝えます。サーバーに登録されたユーザー。

ただし、私の特定の問題は、2つを実行するたびに、サーバーがループを通過することになっている部分に到着したときに、「現在サーバーに登録されているその他のユーザーには次のものが含まれます: MATTCARLJOHN に登録されているその他のユーザー」と表示されることです。サーバーには現在次のユーザーが含まれています: MATTCARLJOHN サーバーに現在登録されている他のユーザーには次のユーザーが含まれます: MATTCARLJOHN" .

私のサーバーは、クライアント側でユーザー名とパスワードに何を入力したかに関係なく、認証をチェックし、そのループに直接スキップするはずの for ループと if ステートメントを完全に無視しているようです。

以下に 2 つのプログラムを示します。 クライアント

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

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

         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);



         clientSocket.close();
     }
}

とサーバー

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 username;
        String username1;
        String password;
        String password1;
        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("Username received: " + username);
            password = inFromClient.readLine();
            System.out.println("Password received: " + password);
            username1=username.toUpperCase() + '\n';
            password1=password.toUpperCase() + '\n';

            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("Other users registered on the server currently include: ");
                    for(int k = 0; k<Login.length; k++){
                        outToClient.writeBytes(Login[k][0]);}
                else
                    outToClient.writeBytes("Invalid Username and/or password.");
                }
            }


        }
    }
}

このサイトに投稿するのはこれが初めてであり、ネットワークと Java 全般に非常に慣れていないため、質問が混乱しているように思われる場合はご容赦ください。

ありがとうございました。

4

2 に答える 2

1

username1とに改行を追加してpassword1います。これらの改行は、ハードコードされたログイン資格情報 ( "MATT","UNCP") には存在しないため、比較...

if(Login[i][0].equals(username1) && Login[i][1].equals(password1)){

成功することはありません。

username1andからの改行を省略してくださいpassword1(少なくとも の後までif)。

ああ、すべてのメッセージの改行を忘れないでください、fe:

outToClient.writeBytes("Invalid Username and/or password.\n");
//                                                       /
//                                                 added the \n
于 2012-05-03T22:32:27.253 に答える
0

コードを実行すると、実際にコードが機能するようです。クライアントでは次を参照してください。

$ java TCPClient -classpath .
Username:
blah
Password:
blah

サーバー上で次のように表示されます。

$ java TCPServer -classpath .
Username received: blah
Password received: blah
于 2012-05-03T20:53:58.957 に答える