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

在第 21 行,您将msg字符串“sum\n”写入服务器。

服务器msg在其第 23 行接收到 并将其存储在name变量中。目前,name是一个 String 对象,因此name(someString)除非前面有new.

最好的办法是使用 if 语句来检查调用了哪个方法,然后运行该方法,因此:

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

如果除了sum.

您可以使用 Java 反射 API 来动态调用类的方法。但是,由于 Java 是一种编译语言,因此局部变量(在方法、构造函数、参数等中)的信息在编译时会被删除。但是,您仍然可以完全访问类名、层次结构、方法和字段(类变量)。一个很好的起点是反射 API 教程或 Object 的 getClass() 方法。但是,这可能超出了您想要做的范围。

于 2013-03-21T22:08:39.557 回答
1

您的服务器不完整。

result = name(parameter);

这行代码调用了一个名为name. 它不使用变量的值查找方法name

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

在这里,您尝试在 int 上使用 String 方法。


更正:

在您的服务器中,您需要处理消息,以便您可以选择正确的方法来调用。此外,您需要处理协议文本以将其转换为正确的 Java 类型,反之亦然。具体来说,您需要调用Integer.parseInt()String协议从协议转换为int您的sum()方法所需的。然后,您需要将int返回的格式设置为 a String,以便您可以将其发送回您的客户。

例如。

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 回答