2014-02-12 48 views
0

我正在开发一个客户端应用程序,它将当前时间秒发送到另一个充当服务器的应用程序。问题是,当我运行我的应用程序时,它只发送第一条消息(例如,如果它是15:55:02它开始发送02一次又一次)。如何让我的应用程序连续发送时间秒?通过套接字连续发送数据

这里是我的代码:

public class ClientActivity extends Activity 
{ 
    private EditText serverIp; 

    private EditText sendMsg; 

    private Button connectPhones; 

    private String serverIpAddress = ""; 

    public static final int SERVERPORT = 8080; 

    private boolean connected = false; 

    private Handler handler = new Handler(); 

    private Socket socket; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     serverIp = (EditText) findViewById(R.id.EditText01); 
     connectPhones = (Button) findViewById(R.id.myButton); 
     connectPhones.setOnClickListener(connectListener); 
    } 

    private OnClickListener connectListener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (!connected) { 
       serverIpAddress = serverIp.getText().toString(); 
       if (!serverIpAddress.equals("")) { 
        Thread cThread = new Thread(new ClientThread()); 
        cThread.start(); 
       } 
      } 
     } 
    }; 

    public class ClientThread implements Runnable { 

     public void run() { 
      try { 
       InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
       Log.d("ClientActivity", "C: Connecting..."); 
       socket = new Socket(serverAddr, SERVERPORT); 
       connected = true; 
       Calendar c = Calendar.getInstance(); 
       int seconds = c.get(Calendar.SECOND); 
       while (connected) { 
        try { 
         Log.d("ClientActivity", "C: Sending command."); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
            .getOutputStream())), true); 
          out.println(seconds); 
          Log.d("ClientActivity", "C: Sent."+seconds); 
        } catch (Exception e) { 
         Log.e("ClientActivity", "S: Error!", e); 
        } 
       } 
       //Log.d("ClientActivity", "C: Closed."); 
      } catch (Exception e) { 
       Log.e("ClientActivity", "C: Error", e); 
       connected = false; 
      } 
     } 
    } 
} 

回答

1

必须重新获得的第二个你要发送它的每一个时间的价值。

while (connected) { 
      Calendar c = Calendar.getInstance(); 
      int seconds = c.get(Calendar.SECOND); 
      try { 
       Log.d("ClientActivity", "C: Sending command."); 
       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
          .getOutputStream())), true); 
        out.println(seconds); 
        Log.d("ClientActivity", "C: Sent."+seconds); 
      } catch (Exception e) { 
       Log.e("ClientActivity", "S: Error!", e); 
      } 
     } 
+0

这帮助了我。谢谢! – WWJD

0

这是因为seconds是永远不会改变。它在循环之外。

试试这个:

public class ClientActivity extends Activity 
{ 
    private EditText serverIp; 

    private EditText sendMsg; 

    private Button connectPhones; 

    private String serverIpAddress = ""; 

    public static final int SERVERPORT = 8080; 

    private boolean connected = false; 

    private Handler handler = new Handler(); 

    private Socket socket; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     serverIp = (EditText) findViewById(R.id.EditText01); 
     connectPhones = (Button) findViewById(R.id.myButton); 
     connectPhones.setOnClickListener(connectListener); 
    } 

    private OnClickListener connectListener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (!connected) { 
       serverIpAddress = serverIp.getText().toString(); 
       if (!serverIpAddress.equals("")) { 
        Thread cThread = new Thread(new ClientThread()); 
        cThread.start(); 
       } 
      } 
     } 
    }; 

    public class ClientThread implements Runnable { 

     public void run() { 
      try { 
       InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
       Log.d("ClientActivity", "C: Connecting..."); 
       socket = new Socket(serverAddr, SERVERPORT); 
       connected = true; 
       Calendar c = Calendar.getInstance(); 
       while (connected) { 
        try { 
         Log.d("ClientActivity", "C: Sending command."); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
            .getOutputStream())), true); 
          out.println(c.get(Calendar.SECOND)); 
          Log.d("ClientActivity", "C: Sent."+seconds); 
        } catch (Exception e) { 
         Log.e("ClientActivity", "S: Error!", e); 
        } 
       } 
       //Log.d("ClientActivity", "C: Closed."); 
      } catch (Exception e) { 
       Log.e("ClientActivity", "C: Error", e); 
       connected = false; 
      } 
     } 
    } 
} 
0

你必须通过发送另一个插座消息之前冲洗流,这应有助于:

out.println(seconds); 
out.flush(); 
+0

我仍然不明白为什么使用flush()? – WWJD

+0

该方法的名称说明了自己,为了刷新流,任何数据都会刷新到目的地。 – user2652394

相关问题