2012-06-18 50 views
4

我試圖做一些服務器/套接字編程。服務器代碼是在Ubuntu機器上用純java編寫的。客戶端代碼是爲我的LG Thrill編寫的。服務器似乎工作正常。我已經通過編寫一個簡單的測試客戶端在純java中測試服務器,該測試客戶端基本上使用ip爲「localhost」的try/catch塊。我檢查了ip是否可以通過ssh'ing從我的手機進入服務器(可以,可以到達)。Android手機上的套接字連接超時

我的服務器代碼如下所示:

package org.vsector.server; 

import java.io.IOException; 
import java.net.ServerSocket; 

public class SceneFlowServer { 

    int port; 
    Thread running = null; 
    CameraHandler handler = null; 

    public SceneFlowServer(int port, CameraHandler handler){ 

     this.port = port; 
     this.handler = handler; 

    } 

    public void start(){ 

     if(handler == null) return; 

     try{ 

      running = new Thread(){ 

       public void run(){ 

        try{ 

         ServerSocket listen = new ServerSocket(port); 
         while(true){ 

          System.out.print("I am waiting on port " + port + "... "); 
          handler.accept(listen.accept()); 
          System.out.println("Got someone!"); 
          Thread spinoff = new Thread(handler); 
          spinoff.start(); 

         } 

        }catch(IOException e){ 

         System.err.println("Could not listen on port " + port + "!"); 
         System.err.flush(); 
         return; 

        } 

       } 

      }; 
      running.start(); 
      running.join(); 

     }catch(Exception e){ 

      System.err.println("Could not start thread!"); 
      System.err.flush(); 

     } 

    } 

} 

我CameraHandler代碼:

package org.vsector.server; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 

public class CameraHandler implements Runnable { 

    Socket client = null; 

    public CameraHandler(){ } 

    public void accept(Socket client){ 

     this.client = client; 

    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     BufferedReader in; 
     try { 
      in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      System.out.println(in.readLine()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      client.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

我的客戶端代碼如下所示:

package org.vsector.client; 

import java.io.PrintWriter; 
import java.net.InetSocketAddress; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class ProcessingClientActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView text = (TextView) findViewById(R.id.textBox); 

     Socket sock; 
     try { 
      text.append("\nOpening and writing to socket... "); 
      sock = new Socket(); 
      sock.connect(new InetSocketAddress("some ip", 4444), 30000); 
      PrintWriter out = new PrintWriter(sock.getOutputStream(), true); 
      out.println("Hello!"); 
      out.close(); 
      sock.close(); 
      text.append("Done!"); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      text.append("Error: " + e + "\n"); 
      text.append(e.getMessage()); 
     } 

    } 
} 

權限設置,但這仍然導致「錯誤:java.net.SocketTimeoutException:連接超時。」

我找不出是什麼原因造成的!有任何想法嗎?

編輯:

沒關係。網絡問題。我在家庭網絡上運行了代碼,一切正常。

+0

我已經添加了我編寫的服務器端代碼。 – vsector

+0

嘗試運行您的測試客戶端,而不是「本地主機」,使用服務器IP並查看它是否仍然有效。 – Dalmas

+0

代碼看起來不錯。你確定你正在使用正確的服務器地址和相同的端口嗎? – alaster

回答

1

有一個與代碼中沒有實際的問題,但一切都與網絡我一直在。

我搬到我的家庭網絡後,一切正常。

+0

但是應用程序沒有發送或接收數據,那麼這是什麼解決方案? – CoronaPintu

1

花花公子,試圖把它們之間添加的flush():

out.println("Hello!"); 
out.flush(); //add this line 
out.close(); 

傻冒關閉套接字可能快..

+0

感謝您的提示,但它似乎沒有連接。所以沒有套接字連接要寫或關閉。 – vsector

+0

tnx,(檢查'up'?) 你的電腦怎麼樣,你聽你的電腦上的這個端口? 可到達沒有聽...你需要sreverSocket或另一個像netcat一樣的3dp聚會應用程序(我用於測試...) – zaxy78

+0

是的,我的電腦正在監聽這個端口,我已經寫了服務器端代碼純java。我已經測試過是否可以通過手機上的ssh訪問電腦,並且已經通過在同一臺電腦上運行代碼測試了端口是否打開。我不知道電話是否無法連接到特定的端口或某些東西。 – vsector