【发布时间】: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