2011-04-18 103 views
3

我一直在嘗試幾天,現在創建一個應用程序客戶端服務器,在Android上,在同一臺機器上運行.... 我已經使用各種顯示功能來顯示狀態的客戶端和服務器...掙扎後,我已經成功地連接他們兩個,這並不是很難做到。Android的客戶端服務器

我面臨的最大問題是何時將數據從客戶端發送到服務器。

我已經使用了DisplayTitle()功能,在服務器端顯示,達到有來自未來的數據的客戶機,但它從來沒有顯示什麼

我覺得現在的問題是在發送數據,因爲我使用PrintWriter發送數據,我已經讀過,我應該刷新它,以便這樣做 - 否則數據將發送只有當我的緩衝區已滿....我已經完成了,仍然沒有!

這是我的客戶端代碼:


public class screen1 extends Activity { 

    private TextView clientState; 
    private String serverIpAddress="10.0.2.2"; 
    public static final int ClientPort = 8080; 
    String message="Hello Server!"; 
    int longitude; 
    int latitude; 
     Cursor c; 
    DBAdapter db; 
    private Handler handler=new Handler(); 
    Socket socket; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.screen1); 
     clientState = (TextView) findViewById(R.id.client_Status); 

     Button b = (Button)findViewById(R.id.mainMenu); 
     b.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 
      Intent i = new Intent(screen1.this, screen2.class); 
      startActivity(i); 
      } 
     }); 

    Thread cThread=new Thread(new ClientThread()); 
    cThread.start(); 
    db=new DBAdapter(this); 
    db.createDatabase(); 
    db.openDataBase(); 


    } 


    public class ClientThread implements Runnable{ 

     private PrintWriter out=null; 

     public void run() 

     { 

      try 

      { 

       InetAddress serverAddr=InetAddress.getByName(serverIpAddress); 

       handler.post(new Runnable(){ 

        public void run(){ 

         clientState.setText(" try to connect!"); 

        } 
       }); 
       socket=new Socket(serverAddr,ClientPort); 
       PrintWriter out=new PrintWriter(socket.getOutputStream(),true); 


      } 
      catch(UnknownHostException e){ 
       System.err.println("Don't know about host"); 
      } 
      catch (IOException e) { 
       System.err.println("Couldn't get I/O for the connection to host"); 
        } 

      if(socket!=null && out!=null){ 
      try{ 

        c=db.getAllData(); 
      if(c.moveToFirst()) 
       { 
        do{ 

         longitude=Integer.parseInt(c.getString(1)); 
         out.println(longitude); 
         out.flush(); 
         latitude=Integer.parseInt(c.getString(2)); 
         out.println(latitude); 

        out.flush(); 
        }while(c.moveToNext()); 

        } 
      out.close(); 
      socket.close(); 
       } 
      catch (IOException e) { 
       System.err.println("IOException: " + e); 
      } 

     } 

    } 

    } 
} 

這裏是我的服務器在DisplayTitle(),我嘗試顯示緯度和經度,我應該從客戶端接收:

public class Server1 extends Activity { 


    //the ip the server is listening to 


    public static String SERVERIP="10.0.2.15"; 


    Socket client; 

    Scanner s=null; 

    TextView serverStatus; 

    Handler handler=new Handler(); 

    protected int ServerPort= 6000; 

    int longitude; 
    int latitude; 

    protected boolean  isStopped = false; 
    private ServerSocket serverSocket=null; 
    private Socket clientSocket=null; 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.server1); 

     Button b = (Button)findViewById(R.id.mainMenu); 

     serverStatus =(TextView)findViewById(R.id.server_Status); 

     b.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0){Intent i = new Intent(Server1.this, Server2.class); 
      startActivity(i);}}); 
     Thread fst=new Thread(new ServerThread()); 
     fst.start(); 
     // MultiThreadedServer server = new MultiThreadedServer(6000); 
     // new Thread(server).start(); 

    } 


public class ServerThread implements Runnable{ 

    public void run(){ 

     try{ 
      InetSocketAddress serverAddr =new InetSocketAddress(SERVERIP,6000); 
    serverSocket = new ServerSocket(); 
    serverSocket.bind(serverAddr); 

     handler.post(new Runnable(){public void run() { 
      serverStatus.setText("wait for clients"); 
     }}); 


     while(true){ 
     //accept for incoming clients 
     client= serverSocket.accept(); 
     handler.post(new Runnable(){public void run() { 
      serverStatus.setText("Connected."); 
     }}); 

     try{ 

      s=new Scanner(new BufferedReader(new InputStreamReader(client.getInputStream()))); 


      while(s.hasNext()){ 
       longitude=Integer.parseInt(s.next()); 
       System.out.println(longitude); 
       latitude=Integer.parseInt(s.next()); 
       System.out.println(latitude); 
      // db.insertData2(longitude,latitude); 



         handler.post(new Runnable() { 

          public void run() { 
           DisplayTitle(longitude,latitude); 

          } 
          }); 
        } 

      break; 

     } 
     catch(Exception e) 
     { 
      handler.post(new Runnable(){ 
       public void run(){ 
        serverStatus.setText("Connection interrupted!!"); 
       } 

      }); 
      e.printStackTrace(); 
     } 



} 
     } 
catch(Exception e) 

     { 
     handler.post(new Runnable() 
     { 
      public void run(){ 
       serverStatus.setText("Error"); 
      } 
     }); 

     e.printStackTrace(); 

     } 
    } 
} 


public void DisplayTitle(int longitude,int latitude) 

{ 
Toast.makeText(this, 
     "longitude: " + longitude +"\n" + 

     "latitude: " + latitude +"\n" , 

     Toast.LENGTH_LONG).show();   
} 

} 

如果有人有任何想法我做錯了,請告訴我!我在這裏瞭解更多細節。

+0

你重定向使用控制檯Telnet會話的端口,像REDIR添加TCP :XXXX:YYYY?如果不是,那麼這將是你的問題。 – NickT 2011-04-18 19:12:20

+0

是的是的......我已經做到了......我成功地連接了他們......問題是發送數據:) – adrian 2011-04-18 19:15:17

回答

2

如果您只是想查看您在客戶端或服務器中發送的數據,那麼使用調試輸出來顯示您正在接收數據有什麼問題?你可以使用logcat來做到這一點。只需在收到或發送數據時將數據打印到logcat。

Log.d(string, string); 
+0

相信我我用過所有東西......其他地方這個問題......我不知道在哪裏!!!即使使用log()或System.out.println(),它也不會在logcat中顯示任何內容.....謝謝你! – adrian 2011-04-18 19:09:57

+1

哦等一下,我看到你現在將結果打印到屏幕上。我錯過了你的system.out的。我會再仔細看一遍。我以爲你根本不打印出來,並想知道你怎麼看到你實際上收到了這些數據。我相信我誤解了這個問題。 – prolink007 2011-04-18 19:11:28

+1

無論如何,我給你投票試圖幫助我;))) – adrian 2011-04-18 19:12:13