Java客户端/ Ruby服务器套接字连接

时间:2014-09-26 04:50:08

标签: java android ruby sockets

我最近被要求为我工作的公司做一个Android应用程序。我的经验主要是在Ruby / C ++ / C#上,所以对Java的编程(尽管sintax很熟悉)对我来说是一个新东西。

我在我的客户端(Java)上有这个方法,它基本上通过套接字建立了与Ruby服务器的连接。它在将文本发送到服务器时工作正常。这是服务器和客户端的代码。

客户(JAVA)

public static void call_socket(String[] cadena)
    {
        PrintWriter salida;
        DataInputStream entrada;

        try 
        {    
            if(SocketClass.sockethost == "")
            {
                if(SocketClass.socketport == 0)
                {
                    get_instalacion();
                }
            }
            Socket clientSocket = new Socket();
            clientSocket.bind(null);
            clientSocket.connect(new InetSocketAddress(SocketClass.sockethost, SocketClass.socketport),30000);
            salida = new PrintWriter(clientSocket.getOutputStream(), true);         
            salida.println(Arrays.toString(cadena)); 
           } 
        catch (Exception e) 
        {
            e.printStackTrace();
            System.out.println("Exception creating new Input/output Streams: " + e);
            return;
        }   

};

服务器(RUBY)

require 'socket'
require 'pg'
require 'openssl'
server = TCPServer.new('0.0.0.0',3000)
loop do
    Thread.start(server.accept) do |client|
        chain= client.gets
        chain= chain.delete('[')
        chain  = chain.delete(']')
        chain = chain.gsub(/\s+/, "")
        chain = chain.gsub(',', "|")
        arr_cade = chain.split("|")
        pg_conn = PGconn.connect(:host=> 'localhost', :dbname => 'termventas', :port => 5432, :user => 'postgres', :password=> 'pass')
        case arr_cade[1]
            when "01"
                arr_cade[2] = arr_cade[2].gsub(/\s+/, "")
                arr_cade[2]= arr_cade[2].upcase
                arr_cade[3] = arr_cade[3].upcase
                result = pg_conn.exec("SELECT entrada, clave_venta FROM terminales_usuarios 
                                       WHERE entrada = '#{arr_cade[2]}' 
                                       AND clave_venta = '#{arr_cade[3]}'")
                if result.count == 0 || result == nil
                    puts "Empty"
                else
                    client.puts "Welcome"                   
                end
        end
        pg_conn.PGconn.close()
        client.close
    end
end

现在,正如我所说,在向服务器发送请求时,一切正常,我能够发送正确的字符串[]并在套接字服务器上正确评估它。现在我试图在客户端实现从服务器获取输入。我已经完成了一些研究,这基本上是我发现需要完成以捕获服务器产生的输入:

        BufferedReader server_input= new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String answer_back= server_input.readLine();
        Log.v("Response", answer_back);

但是,如果我这样做,它会提示我添加一个throw声明或用try / catch包围它。我继续添加try / catch并编译我的代码。

执行触发挂起的套接字连接的操作后,接下来会发生什么。应用程序没有崩溃或任何东西,套接字根本不响应(既不发送/接收)。我真的不知道造成这种情况的原因。如果我删除涉及捕获和显示服务器返回的字符串的句子,一切正常。

有什么想法吗?

BTW,即时通讯使用Eclipse并使用模拟器来模拟我的Android设备。

1 个答案:

答案 0 :(得分:1)

好的,我想到了我的问题所在。它不是我的客户端(Java),而是我的服务器(Ruby)。当我执行SQL查询以确定是否使用通过套接字发送的数据注册时,如果没有找到注册表,我没有将任何响应发送回客户端。看,我有这条线:

puts "Empty"

这只是在我的服务器日志中打印结果。通过更改实际传递给客户端的响应,我只是这样做:

client.puts "Empty"

因此,我的java客户端有两次来自服务器的响应(当sql查询返回某些东西时)并且它不再挂断,我认为这是由客户端“监听”并期望得到回复从服务器,但从来没有真正得到任何(除非sql查询返回除了nil之外的东西)。

希望这对将来的任何人都有用。感谢所有花时间审阅/回复我的消息的人。