0

client1.java

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

class client1 {
   public static void main (String [] args) {

       Socket connectToServer;
       OutputStream out;
       BufferedReader in;
       String msg;
       String result;

       try {
            connectToServer = new Socket ("localhost", 5555);
            out = connectToServer.getOutputStream ( );

            in = new BufferedReader (new InputStreamReader (connectToServer.getInputStream ( )));

            msg = "sum" + "\n";

            out.write (msg.getBytes ( ), 0, msg.length ( ));
            msg = "5" + "\n";

            out.write (msg.getBytes ( ), 0, msg.length ( ));
            result = in.readLine ( );

            System.out.println (result);

            connectToServer.close ( );
      } catch (Exception ex) {System.out.println (ex);}
   }
}

server1.java

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

class server1 {
   public static void main (String [] args) {

       ServerSocket c;
       Socket cs;
       OutputStream out;
       BufferedReader in;
       String msg;
       String name;
       int parameter;
       int result=0;

       try {
            c = new ServerSocket (5555);
            cs = c.accept ( );

            out = cs.getOutputStream ( );
            in = new BufferedReader (new InputStreamReader (cs.getInputStream ( )));

            name = in.readLine( );

            parameter = Integer.parseInt (in.readLine ( ));

            result = name(parameter);
            out.write (result.getBytes ( ), 0, result.length ( ));                

        } catch (Exception ex) {System.out.println (ex);}
    }

    static int sum (int n)
    {
        return (n + 5);
    }
}

サーバーからsumメソッドを呼び出したいのですが、関数の結果をバックアップするためにサーバーから除外しましたが、いくつかのバグがあり、本当に疲れていて、友達の助けが必要です。

私の悪い英語でごめんなさい

4

2 に答える 2

1

サーバーが完成していません。

result = name(parameter);

このコード行は、という名前のメソッドを呼び出しますname。変数の値を使用してメソッドを検索することはありませんname

int result=0;
// [...]
out.write (result.getBytes ( ), 0, result.length ( ));

ここでは、intでStringメソッドを使用しようとします。


訂正:

サーバーでは、呼び出す正しい方法を選択できるようにメッセージを処理する必要があります。さらに、プロトコルのテキストを処理して適切なJavaタイプに変換したり、その逆を行ったりする必要があります。具体的には、を呼び出して、プロトコルからメソッドで必要なものInteger.parseInt()に変換する必要があります。次に、返されたものをとしてフォーマットして、クライアントに送り返すことができるようにする必要があります。Stringintsum()intString

例えば。

if ("sum".equals(name))
    {
    // TODO: catch NumberFormatException and handle bad input
    final int parameter_value = Integer.parseInt(parameter);
    result = sum(parameter_value);
    }
于 2013-03-21T22:01:43.900 に答える
1

21行目では、msg文字列「sum\n」をサーバーに書き込んでいます。

msg23行目で受信したサーバーはそれをname変数に格納します。現在、nameはStringオブジェクトであるため、name(someString)前に。が付いていない限り、実行しようとしても機能しませんnew

最善の策は、ifステートメントを使用して、呼び出されたメソッドを確認してから、そのメソッドを実行することです。

if (name.equals("sum")) {
    result = sum(parameter);
    out.write (result.getBytes ( ), 0, result.length ( )); 
}

以外にもメソッドがある場合は、switchステートメントを使用することもできますsum

JavaリフレクションAPIを使用して、クラスのメソッドを動的に呼び出すことができます。ただし、Javaはコンパイルされた言語であるため、ローカル変数(メソッド、コンストラクター、パラメーターなど内)の情報はコンパイル時に消去されます。ただし、クラス名、階層、メソッド、およびフィールド(クラス変数)には引き続き完全にアクセスできます。良い出発点は、Reflection APIチュートリアルまたはObjectのgetClass()メソッドです。しかし、これはおそらくあなたがやりたいことの範囲を超えています。

于 2013-03-21T22:08:39.557 に答える