2014-09-26 176 views
0

我最近被要求为我工作的公司做一个android应用程序。我的经验主要集中在Ruby/C++/C#上,所以使用Java进行编程(尽管它是熟悉的sintax)对我来说是一件新事物。Java客户端/ Ruby服务器套接字连接

我在我的客户端(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并编译我的代码。

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

任何想法?

顺便说一句,即时通讯使用Eclipse,也使用模拟器,以及模拟我的Android设备。

+0

我不知道这是否会工作。写完后请尝试''client.close_write''。 – rejin 2014-09-26 05:37:13

回答

1

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

puts "Empty" 

这是从字面上只是打印结果在我的服务器日志。通过改变响应,以实际交付到客户端,我只是做了这一点:

client.puts "Empty" 

因此,我的Java客户端必须从服务器的响应两次(当SQL查询返回的东西或者不是),并没有关系再也不会挂断了,我认为这是由客户端“聆听”引起的,并期待从服务器回复,但从来没有真正得到任何东西(除非sql查询返回了除nil以外的内容)。

希望这对未来的任何人都有用。感谢大家花了一些时间来审核/回复我的信息。

相关问题