呼叫从服务器
问题描述:
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);
}
}
我想从一个服务器调用数总和法,我从服务器除外备份功能的结果,但也有一些错误,我真的累了,从它需要一些帮助我的朋友们
对不起我的英语不好
答
更正:
您的服务器不完整。
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);
}
答
在第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()方法。但是,这可能超出了你想要做的事情的范围。
什么是错误?什么是问题? – benzonico 2013-03-21 21:48:59
如果你想直接从客户端调用方法,而不仅仅是接收结果,你应该考虑使用[RMI](http://docs.oracle.com/javase/1.5。0/docs/guide/rmi /)而不是套接字。 – niculare 2013-03-21 21:50:32
@niculare但我想通过使用套接字 – 2013-03-21 21:52:12