【发布时间】:2015-02-22 16:58:17
【问题描述】:
我正在使用带有 SSL 的 Erlang,
我的服务器套接字监听传入的客户端连接并为每个传入连接生成一个新线程(假设循环函数称为clientroutine())
这个帖子是根据我在网上找到的这个教程设计的:http://erlycoder.com/89/erlang-ssl-sockets-example-ssl-echo-server-ssl-client-
所以基本上clientroutine() 等待receive,从客户端获取数据,根据接收到的数据执行一些操作并再次递归调用自身
现在,问题是当我发出ssl:send(Socket, Data) 时,客户端(基于Java)没有从输入流中得到任何东西
有趣的是,只有当我像这样在 ssl:send 之后递归调用 clientroutine() 时才会发生这种情况(为简单起见,我跳过了套接字关闭和默认情况):
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 客户端在这样的单独线程中启动输入流侦听器(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 inputstream有些关系
【问题讨论】:
标签: java sockets ssl erlang client-server