有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

发出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) 个答案

  1. # 1 楼答案

    我发现readLine()从inputstream中获取一行所需的换行符(奇怪的是)在我以程序的“递归”版本发送消息时没有包括在内,所以在我将\n附加到传输的消息后,一切都很顺利