2014-09-26 178 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以外的內容)。

希望這對未來的任何人都有用。感謝大家花了一些時間來審覈/回覆我的信息。

相關問題