2016-05-07 26 views
1

Ich möchte eine Schnittstelle in Java oder Erlang erstellen, die Commands von Benutzern verarbeiten, Zeichenfolge erstellen und diese Zeichenfolge an Ada-Anwendung senden. Wie kann ich das richtig machen? Ich habe versucht, dies mit Sockets zu tun, aber es funktioniert nicht? Es wäre Ihnen dankbar, wenn Sie mir einen Beispielcode oder einige Referenzen zur Verfügung stellen könnten.Sendet Daten von Java/Erlang an Ada

Hier Code Server Ada Aufgabe:

task body ConfigServer is 
    Receiver : GNAT.Sockets.Socket_Type; 
    Connection : GNAT.Sockets.Socket_Type; 
    Client  : GNAT.Sockets.Sock_Addr_Type; 
    Channel : GNAT.Sockets.Stream_Access; 
    S : Unbounded_String; 
    C : Character; 
    begin 
    Put_Line("SERVER CONFIG STARTED..."); 
    GNAT.Sockets.Create_Socket (Socket => Receiver); 
    GNAT.Sockets.Set_Socket_Option 
     (Socket => Receiver, 
     Option => (Name => GNAT.Sockets.Reuse_Address, Enabled => True)); 
    GNAT.Sockets.Bind_Socket 
     (Socket => Receiver, 
     Address => (Family => GNAT.Sockets.Family_Inet, 
        Addr => Addresses (Get_Host_By_Name (Host_Name), 1), 
        Port => 2080)); 
    GNAT.Sockets.Listen_Socket (Socket => Receiver); 
    loop 
     GNAT.Sockets.Accept_Socket 
      (Server => Receiver, 
      Socket => Connection, 
      Address => Client); 
     Ada.Text_IO.Put_Line 
      ("Client connected from " & GNAT.Sockets.Image (Client)); 
     Channel := GNAT.Sockets.Stream (Connection); 
     begin 
      loop 
       C := Character'Input (Channel); 
       if C /= '.' then 
       Append(S, C); 
       else 
       Put_Line("Received: " & S); 
       Set_Unbounded_String(S, ""); 
       end if; 
      end loop; 
     exception 
      when Ada.IO_Exceptions.End_Error => 
       null; 
     end; 
     GNAT.Sockets.Close_Socket (Connection); 
    end loop; 
    end ConfigServer; 

Erlang Code:

-module (client). 
-compile([export_all]). 

sendMsg() -> 
    {ok, Socket} = gen_udp:open(2560), 
    gen_udp:send(Socket, {127,0,0,1}, 2080, "Hello"), 
    gen_udp:close(Socket). 

Java-Code:

import java.io.IOException; 
import java.io.PrintStream; 
import java.net.Socket; 
import java.util.Scanner; 

public class Main { 

    public static void main(String[] args) { 
     Socket socket = null; 
     try { 
      socket = new Socket("127.0.0.1", 2080); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     PrintStream output = null; 

     try { 
      output = new PrintStream(socket.getOutputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     String input; 
     Scanner scanner = new Scanner(System.in); 
     do { 
      input = scanner.nextLine(); 
      output.print(input); 
     }while (input.equalsIgnoreCase("EXIT")); 


     try { 
      output.close(); 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Ich denke, das Problem ist, dass Java und Erlang in virtuellen Arbeits environemnt und ich brauche eine Low-Level-API zu Sockets. Habe ich recht?

+0

Schreibe den Code, den Sie versucht haben. –

+0

Der Erlang-Code scheint UDP zu verwenden, aber der Ada-Code verwendet TCP. Der Java-Code gibt nur eine Zeile vor dem Beenden aus (aber diese Zeile sollte gesendet werden). ** Und **, "es funktioniert nicht" hilft uns nicht. Wie funktioniert es nicht? –

+0

Ja, du hast Recht. Wenn ich TCP-Verbindung in Erlang erstellte und Ada-Code korrigierte, um "localhost" wie unten erwähnt zu verwenden, funktioniert es auch. Danke für die Hilfe. – michalk93

Antwort

2

Ich bin auf OS X, und ich habe dies durch

(Ada) zu arbeiten beginnen

GNAT.Sockets.Bind_Socket 
    (Socket => Receiver, 
    Address => (Family => GNAT.Sockets.Family_Inet, 
       Addr => Addresses (Get_Host_By_Name (“localhost"), 1), 
       Port => 2080)); 

Es stellt sich heraus, dass auf OS X, Host_Name kehrt nidhoggr.local (meine Maschinen genannt werden nach drachenähnlichen Wesen, und ich wurde knapp), die eine Netzwerkadresse hat, 192.168.1.74. ”localhost”, auf der anderen Seite gibt Ihnen 127.0.0.1.

(Java)

do { 
    input = scanner.nextLine(); 
    output.print(input); 
}while (!input.equalsIgnoreCase("EXIT")); 

(siehe !)

+0

Ich bin dankbar für Ihre Hilfe! Es funktioniert nicht wegen Host_Name und falscher Adresse wie du geschrieben hast. – michalk93