2016-05-07 15 views
1

JavaまたはErlangでインターフェースを作成し、ユーザーcommadsを処理し、文字列を作成し、この文字列をAdaアプリケーションに送信したいと考えています。私はそれをどのようにして適切に行うことができますか? 私はソケットでこれをしようとしましたが動作しませんか? サンプルコードや参考文献を私に教えていただければ幸いです。ここでJava/ErlangからAdaに文字列データを送信

はエイダタスクServerコードです:

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コード:

-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コード:

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

私はそれが問題だと思うJavaとErlangのは仮想で働くということです私はいくつかの低レベルのAPIをソケットに必要としています。私は正しい?

+0

ポストあなたが試したコード(!を参照してください)。 –

+0

ErlangコードはUDPを使用しているようですが、AdaコードはTCPを使用しています。 Javaコードは、終了する前に1行だけを出力します(ただし、その行は送信されます)。 **そして**、 "それはうまくいかない"私たちを助けません。どのようにして動作しませんか? –

+0

はい、そうです。 ErlangでTCP接続を作成し、以下に述べるように "localhost"を使用するようにAdaコードを修正したところ、それもうまく動作します。手伝ってくれてありがとう。 – michalk93

答えて

2

私はOS X上だし、私はこれが

(エイダ)で作業を開始するようになった

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

それはHost_Nameリターンnidhoggr.localが(私のマシンが命名され、OS X上で、ことが判明ドラゴンのような実体の後で、私は不足していた)、それは1つのネットワークアドレス、192.168.1.74を持っています。これに対して、”localhost”127.0.0.1です。

(Java)の

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

+0

私はあなたの助けに感謝しています!あなたが書いたようにHost_Nameと間違ったアドレスのために動作しません。 – michalk93

関連する問題