从服务器调用方法

时间:2013-03-21 21:45:48

标签: java client-server

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方法,我从服务器中除了支持函数的结果但是有一些错误我真的很累它需要一些帮助我的朋友

抱歉我的英文不好

2 个答案:

答案 0 :(得分: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格式化为String,以便将其发送回客户。

例如

if ("sum".equals(name))
    {
    // TODO: catch NumberFormatException and handle bad input
    final int parameter_value = Integer.parseInt(parameter);
    result = sum(parameter_value);
    }

答案 1 :(得分:1)

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

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

最好的办法是使用if语句检查调用哪种方法,然后运行该方法,以便:

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

如果除sum之外还有更多方法,你甚至可以使用switch语句。

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