0

私は Java Computer Networking に不慣れで、そもそもプログラミングが得意ではありませんが、1 行だけを受け入れるはずのこのサーバーとクライアントを構築することができました。関数 (add、sub、divide) と 2 つの int を計算し、答えを出力します。2つを接続できますが、行を入力しても何もしません。任意の洞察をいただければ幸いです。ありがとうございました!

サーバ

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.lang.Math;


public class MathServer
{


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

     ServerSocket yourSock = new ServerSocket(50000);
     System.out.println("Please Wait....");

     while(true)
     {
        Socket clientSock = yourSock.accept();
        System.out.println("Connected!");
        process(clientSock);


     }


  }

  static void process(Socket sock) throws IOException
  {
     InputStream in = sock.getInputStream();
     BufferedReader br = new BufferedReader(new InputStreamReader(in));

     OutputStream out = sock.getOutputStream();
     PrintWriter pw = new PrintWriter(out,true);

  //Talk to the client
     String input = br.readLine();

     while(input != null && !input.equals("disconnect"))
     {  

        Scanner sc = new Scanner(System.in);
        String func = sc.nextLine();
        double num1 = sc.nextInt();
        double num2 = sc.nextInt();

        double answer;          

        switch (func)
        {
           case "add":  answer = num1 + num2;
              System.out.println(answer);
              break;

           case "sub":  answer = num1 - num2;
              pw.println(answer); 
              break;

           case "multiply":  answer = num1 * num2;
              pw.println(answer);        
              break;

           case "power":  answer = Math.pow(num1, num2);
              pw.println(answer);
              break;

           case "divide":  answer = num1 / num2;
              pw.println(answer);         
              break;

           case "remainder": answer = num1 % num2;
              pw.println(answer);       
              break;

           case "square": answer = Math.sqrt(num1) ;
              pw.println(answer);       
              break;

           case "cube": answer= Math.cbrt(num1);
              pw.println(answer);        
              break;



        }

        sock.close();
     }

  }
}

クライアント

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


public class Client
{


  public static void main(String[] args) throws Exception
  {
     Socket Sock = new Socket("localhost", 50000);
     BufferedReader br = new BufferedReader(new InputStreamReader(Sock.getInputStream()));
     PrintWriter pw = new PrintWriter(Sock.getOutputStream(), true);


     Scanner sc = new Scanner(System.in);
     String input;


     while(true)
     {
     //System.out.println("Please enter your function and numbers:");
        input = sc.nextLine();

        pw.println(input);

        if(input.equals("disconnect"))
        {
           System.out.println("You have been disconnected");
           break;

        }


        System.out.println(br.readLine());
     }

     Sock.close();

  }


}
4

3 に答える 3

0

System.inから読み取るスキャナーとコード内のネットワーク接続を混合しています。

たとえば、サーバーの入力をコマンドラインから読み取りたいのはなぜですか?

Scanner sc = new Scanner(System.in);
String func = sc.nextLine();
double num1 = sc.nextInt();
double num2 = sc.nextInt();

たとえば、受け取った入力を分割し、Stringのsplitメソッドを使用して計算することができます。

于 2013-01-26T22:16:38.773 に答える
0
  • クライアントとサーバー間でデータを送受信する順序を調整する必要があります。
  • @Jacobが述べたようSystem.inに、入力データの代わりにから読み取っています。入力から読み取ることができますString
  • readLineステートメット内にステートメントを配置whileして、クライアントからの読み取りを続行します。

これは次のようになります。

String input;
while ((input = br.readLine())!= null && !input.equals("disconnect")) {
   Scanner sc = new Scanner(input);
   String func = sc.next();
   double num1 = sc.nextDouble();
   double num2 = sc.nextDouble();
   ...
}

次に、sock.close()ステートメントをループの外に移動します。while

これで、クライアントからの入力コマンドが1行に表示されます。

add 12 15

また、クライアントからデータをフラッシュします。

pw.flush();
于 2013-01-26T22:35:42.807 に答える
0

問題はサーバーコードの行にあると思います

    Scanner sc = new Scanner(System.in);

独自の入力ストリームを使用する必要があります。

Scanner sc = new Scanner(in);

スキャナーは使ったことがありません。これに対する別の方法は、ものを文字列として読み取り、必要に応じて変換することです。たとえば、Integer.parseInt()

于 2013-01-26T22:20:14.653 に答える