数学服务器和客户端Java不工作

数学服务器和客户端Java不工作,java,networking,Java,Networking,我是Java计算机网络新手,一开始并不擅长编程,但是,我能够构建这个服务器和客户端,它应该只接受一行代码。一个函数(加法、减法、除法)和两个整数,然后计算并打印答案。我可以把这两个连接起来,但当我把这条线打进去时,它什么也没做。如有任何见解,将不胜感激。谢谢大家! 服务器 import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; import java.lan

我是Java计算机网络新手,一开始并不擅长编程,但是,我能够构建这个服务器和客户端,它应该只接受一行代码。一个函数(加法、减法、除法)和两个整数,然后计算并打印答案。我可以把这两个连接起来,但当我把这条线打进去时,它什么也没做。如有任何见解,将不胜感激。谢谢大家!

服务器

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

  }


}

您正在混合从System.in读取的扫描仪和代码中的网络连接

例如,为什么要从命令行读取服务器中的输入

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

例如,您可以使用String的split方法拆分接收到的输入并从中计算。我认为问题出在服务器代码第行

    Scanner sc = new Scanner(System.in);
您应该使用自己的输入流:

Scanner sc = new Scanner(in);
我以前没用过扫描仪。另一种方法是以字符串形式读取内容并根据需要进行转换,例如Integer.parseInt()

  • 您需要安排在客户端和服务器之间发送和接收数据的顺序
  • 正如@Jacob所提到的,您正在从
    系统中读取数据。在
    中,您可以从输入的
    字符串
    中读取数据
  • readLine
    语句放在
    语句中,而
    statemet继续从客户端读取
这看起来像:

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
循环之外

现在,来自客户端的输入命令将显示在一行上,例如

add 12 15
同时刷新客户端的数据:

pw.flush();

您是否使用Eclipse之类的调试器对代码进行了STP测试?请在代码中添加日志记录。