2013-03-21 191 views
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); 
    } 
} 

我想从一个服务器调用数总和法,我从服务器除外备份功能的结果,但也有一些错误,我真的累了,从它需要一些帮助我的朋友们

对不起我的英语不好

+0

什么是错误?什么是问题? – benzonico 2013-03-21 21:48:59

+0

如果你想直接从客户端调用方法,而不仅仅是接收结果,你应该考虑使用[RMI](http://docs.oracle.com/javase/1.5。0/docs/guide/rmi /)而不是套接字。 – niculare 2013-03-21 21:50:32

+0

@niculare但我想通过使用套接字 – 2013-03-21 21:52:12

回答

1

您的服务器不完整。

result = name(parameter); 

这行代码调用名为name的方法。它没有使用变量name的值查找方法。

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

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


更正:

在你的服务器,你需要处理的消息,这样您就可以选择正确的方法来调用。此外,您需要处理协议的文本以将其转换为适当的Java类型,反之亦然。具体而言,您需要致电Integer.parseInt()String从协议转换为sum()方法所需的int。然后,您需要格式化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

在第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 ()); 
} 

你甚至可以使用,如果你将有更多的switch语句方法除sum

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