我正在使用带有SSL的Erlang,
我的服务器套接字侦听传入的客户端连接,并为每个传入连接生成一个新线程(假设循环函数称为clientroutine()
)
此主题是基于我在网上找到的本教程设计的:http://erlycoder.com/89/erlang-ssl-sockets-example-ssl-echo-server-ssl-client-
所以基本上clientroutine()
在receive
中等待,从客户端获取数据,根据接收的数据执行某些操作并再次递归调用自己
现在,问题是当我发出ssl:send(Socket, Data)
时,客户端(基于Java)从输入流中得不到任何东西
有趣的是,只有当我在clientroutine()
之后递归调用ssl:send
时才会发生这种情况(为了简单起见,我跳过套接字关闭和默认情况):
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客户端从输入流接收字符串:
clientroutine(Socket) ->
ssl:setopts(Socket, [{active, once}]),
receive
{ssl, Sock , Data} ->
ok = ssl:send(Sock, "~100 bytes list goes to client")
end.
Java-client在一个单独的线程中启动输入流监听器(上面已经在类字段中声明了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可能需要在传输的消息之后将一些特殊字符推送到输出流中?
更新。无论是否有递归调用,Erlang客户端都能正确接收所有内容。似乎这与Java输入流
有些相关答案 0 :(得分:0)
我发现readLine()
从输入流中获取一行所需的换行符,当我在"递归"中发送消息时,(奇怪地)不包括换行符。该程序的版本,所以一切顺利,我将\n
追加到传输的消息