2012-11-22 100 views
2

我是一個新手,所以我很抱歉,如果我問愚蠢的問題。
我必須做一個與服務器的套接字連接。
客戶端(android設備)必須向服務器發送消息並等待確認消息。然後,如果服務器在30秒內沒有收到任何來自客戶端的請求,則發送一個確認消息請求。
我做了第一部分:客戶端發送消息並閱讀響應。
我問的是:客戶端如何等待來自服務器的可能消息?
這是我寫的代碼:
在onCreate方法:客戶端如何等待可能的服務器消息?

Thread myThread = new Thread(new myRunnable()); 
myThread.start(); 

這是myRunnable:

public class myRunnable implements Runnable{ 
    public void run(){ 
    try{ 
     Socket socket = new Socket(serverIp, serverPort); 
     InputStream is = socket.getInputStream(); 
     OutputStream out = socket.getOutputStream(); 
     out.write(byteBuffer.array()); 
     out.flush(); 
     byte[] bbb = new byte[1024]; 
     // Receive message from server 
     int bytesToRead= is.read(bbb); 
     is.close(); 
     out.close(); 
     socket.close(); 

Successives讀取操作返回-1,所以我怎麼能留在等待服務器消息?
非常感謝您的任何建議。

+0

請勿在標題中加入標籤:http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles –

回答

2

你不應該關閉流。關閉流時,您與服務器的通信會關閉。通常服務器通信發生在無限循環中。事情是這樣的:

public class myRunnable implements Runnable{ 
    public void run(){ 
    try{ 
     Socket socket = new Socket(serverIp, serverPort); 
     InputStream is = socket.getInputStream(); 
     OutputStream out = socket.getOutputStream(); 
     out.write(byteBuffer.array()); 
     out.flush(); 
     byte[] bbb = new byte[1024]; 
     while (true) { 
     // Read next message. 
     bytesToRead = is.read(bbb); 
     // handle message... 
     // If you need to stop communication use 'break' to exit loop; 
     } 
     is.close(); 
     out.close(); 
     socket.close(); 

所以線程上線bytesToRead = is.read(bbb)停止,直到服務器發送的任何消息,後其處理消息你想和回來閱讀下一消息的任何方式。如果您需要使用break停止通信退出循環。

+0

謝謝您的回答!我嘗試了你告訴我,但我沒有收到第一條消息,「bytesToRead」始終爲-1。我在這個答案中讀到:[link](http://stackoverflow.com/a/611777/1696856):「-1的讀數並不意味着,」這個嘗試中沒有數據,「它意味着」 「我不知道該怎麼辦!謝謝 – jane1012

+0

你確定服務器沒有關閉連接嗎? –

+0

有沒有辦法知道這個?方法isConnected ()? – jane1012

相關問題