【问题标题】:Send string data from Java/Erlang to Ada将字符串数据从 Java/Erlang 发送到 Ada
【发布时间】:2016-09-02 20:27:26
【问题描述】:

我想在 Java 或 Erlang 中创建一些接口,用于处理用户命令、创建字符串并将该字符串发送到 Ada 应用程序。我怎样才能以适当的方式做到这一点? 我尝试使用套接字来执行此操作,但它不起作用? 如果您能提供一些示例代码或一些参考资料,将不胜感激。

这里是 Ada 任务服务器代码:

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。我说的对吗?

【问题讨论】:

  • 贴出你试过的代码。
  • Erlang 代码似乎使用 UDP,但 Ada 代码使用 TCP。 Java 代码在退出前只输出一行(但应该发送该行)。 而且,“它不起作用”对我们没有帮助。它在什么方面不起作用?
  • 是的,你是对的。当我在 Erlang 中创建 TCP 连接并更正 Ada 代码以使用下面提到的“localhost”时,它也可以工作。感谢您的帮助。

标签: java sockets erlang ipc ada


【解决方案1】:

我在 OS X 上,我开始工作了

(阿达)

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

事实证明,在 OS X 上,Host_Name 返回 nidhoggr.local(我的机器是以类似龙的实体命名的,而我运行不足),它有一个网络地址,192.168.1.74。另一方面,”localhost” 确实给了你127.0.0.1

(Java)

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

(见!

【讨论】:

  • 感谢您的帮助!由于您写的 Host_Name 和错误的地址,它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多