2013-03-21 3 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

+0

, если вы хотите вызвать метод непосредственно с клиента, а не просто получить результат, вам следует рассмотреть возможность использования [RMI] (http://docs.oracle.com/javase/1.5.0/docs/guide/rmi /) вместо сокетов. – niculare

+0

@niculare, но я хочу получить результат с помощью сокетов –

ответ

1

Ваш сервер не завершен.

result = name(parameter); 

Эта строка кода вызывает метод с именем name. Он не ищет метод, использующий значение переменной name.

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

Здесь вы пытаетесь использовать методы String на int.


Исправление:

В вашем сервере вам необходимо обработать сообщение, так что вы можете выбрать правильный метод для вызова. Кроме того, вам необходимо обработать текст вашего протокола, чтобы преобразовать его в соответствующие типы 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

В строке 21 вы пишете msg строку «Сумма \ п» к серверу.

Сервер получил msg в своей строке 23 и сохранил его в переменной name. В настоящее время name является объектом String, поэтому попытка запуска name(someString) не будет работать, если только предшествует new.

Лучше всего использовать, если заявление, чтобы проверить, какой метод вызывается, а затем запустить этот метод, так:

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

Можно даже использовать переключатель заявление, если вы собираетесь иметь больше методы кроме sum.

Вы можете использовать API отражения Java для динамического вызова методов в классе. Однако, поскольку Java является скомпилированным языком, локальные переменные (в пределах методов, конструкторов, параметров и т. Д.) Удаляются при компиляции. Однако у вас все еще есть полный доступ к именам классов, иерархиям, методам и полям (переменные класса). Хорошей отправной точкой является Reflection API tutorial или метод getClass() объекта. Однако это, вероятно, выходит за рамки того, что вы хотите сделать.

Смежные вопросы