通过套接字连续发送数据

时间:2014-02-12 00:16:06

标签: android

我正在开发一个客户端应用程序,该应用程序使用另一个充当服务器的应用程序发送当前时间秒。问题是,当我运行我的应用程序时,它只发送第一条消息(例如,如果它是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;
            }
        }
    }
}

3 个答案:

答案 0 :(得分: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);
            }
        }

答案 1 :(得分: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;
            }
        }
    }
}

答案 2 :(得分:0)

您必须在通过套接字发送另一条消息之前刷新流,这应该有所帮助:

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