Erlang - 发出ssl:send(套接字,数据)时未收到数据

时间:2014-12-24 15:37:55

标签: java sockets ssl erlang client-server

我正在使用带有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输入流

有些相关

1 个答案:

答案 0 :(得分:0)

我发现readLine()从输入流中获取一行所需的换行符,当我在"递归"中发送消息时,(奇怪地)不包括换行符。该程序的版本,所以一切顺利,我将\n追加到传输的消息