2011-04-18 131 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