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