发出ssl:send(socket,数据)时未收到java Erlang数据
我将Erlang与SSL一起使用,
我的服务器socket侦听传入的客户端连接,并为每个传入连接生成一个新线程(假设循环函数为clientroutine()
)
此线程是根据我在web上找到的教程设计的:http://erlycoder.com/89/erlang-ssl-sockets-example-ssl-echo-server-ssl-client-
所以基本上clientroutine()
在receive
中等待,从客户机获取数据,根据接收到的数据执行一些操作,然后再次递归地调用自身
现在的问题是,当我发出ssl:send(Socket, Data)
时,客户机(基于Java)不会从inputstream中获取任何内容
有趣的是,只有当我像这样在ssl:send
之后递归调用clientroutine()
时才会发生这种情况(为了简单起见,我跳过socket关闭和默认情况):
clientroutine(Socket) ->
ssl:setopts(Socket, [{active, once}]),
receive
{ssl, Sock , Data} ->
ok = ssl:send(Sock, "~100 bytes list goes to client"),
clientroutine(Socket)
end.
以下操作正常(即不发生递归和线程完成),我的Java客户端从inputstream接收字符串:
clientroutine(Socket) ->
ssl:setopts(Socket, [{active, once}]),
receive
{ssl, Sock , Data} ->
ok = ssl:send(Sock, "~100 bytes list goes to client")
end.
Java客户端在单独的线程中启动inputstream侦听器,如下所示(BufferedReader in
已在类字段中声明):
new Thread(new Runnable(){
@Override
public void run() {
String msg;
try {
while((msg=in.readLine())!=null)
System.out.println("user received: " + msg);
} catch (IOException e) {
System.out.println("user: exception occured - inputstream reader");
}
}}).start();
我还没有检查这是否适用于Erlang客户机,我也会在检查它时更新我的帖子,但无论如何,我需要它来适用于Java客户机
你知道为什么会这样吗?
可能我应该使用其他BufferedReader例程而不是readLine()
,或者BufferedReader需要在传输消息后将某些特殊字符推送到outputstream中
更新。Erlang客户端正确地接收所有内容,无论是否使用递归调用。似乎这与Java inputstream有些关联
# 1 楼答案
我发现
readLine()
从inputstream中获取一行所需的换行符(奇怪的是)在我以程序的“递归”版本发送消息时没有包括在内,所以在我将\n
附加到传输的消息后,一切都很顺利