2013-10-05 25 views
0

簡單的步驟:Android的 - 消息準備閱讀,但我不能獲取它們

  • 客戶端寫入消息,並將其發送到服務器(正常工作)
  • 消息被分發給服務器(正常工作)
  • 服務器抓起消息(正常工作)
  • 服務器處理該消息並作出相應的應答(正常工作)
  • 服務器將消息發送回給客戶機(正常工作)
  • 消息被分發給客戶端(正常工作)
  • 客戶抓起消息(NOP ....問題)

正如你在代碼中看到;每次按下「oos」的大小實際上都在增加,但我無法以某種方式讀取oos中的數據。

當我按下按鈕時,開始被調用,並且當我按下另一個按鈕Get獲取調用。

//客戶

package com.example.clienttest; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    Thread m_objThreadClient; 
    Socket clientSocket; 
    TextView serverMessage; 
    EditText clientMessage; 
    String sIn = "Nothing", sOut; 
    DataOutputStream oos; 
    DataInputStream ois; 
    int i = 0; 

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

     serverMessage = (TextView) findViewById(R.id.textView1); 
     clientMessage = (EditText) findViewById(R.id.editText1); 


     m_objThreadClient = new Thread(new Runnable(){ 
      public void run() 
      { 
       try { 
        clientSocket = new Socket("10.0.2.2", 4000); 
        oos = new DataOutputStream (clientSocket.getOutputStream()); 
        ois = new DataInputStream (clientSocket.getInputStream()); 


       } catch (Exception e) { 
        serverMessage.setText(e.getMessage()); 
       } 

      } 
     }); 
     m_objThreadClient.start(); 


    } 

    public void Start(View view)throws IOException{ 
     sOut = clientMessage.getText().toString(); 
      try { 
       oos.writeUTF(sOut); 
       serverMessage.setText("Messages availible:" + ois.available()); 

      } 
      catch (Exception e) { 
      } 

    } 
    public void Get(View view){ 
      try { 

       sIn = ois.readUTF(); 
       serverMessage.setText("Message: " + sIn); 
      } 
      catch (Exception e) { 
      } 

    } 

    public void onStop(){ 
     try { 
      oos.close(); 
      ois.close(); 
      clientSocket.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

//服務器

import java.net.ServerSocket; 
import java.net.Socket; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.PrintWriter; 

import java.util.Hashtable; 

public class Server2 { 

    @SuppressWarnings("resource") 
    public static void main (String[] args) throws IOException { 

     ServerSocket server = null; 
     try { 
      server = new ServerSocket(4000); 
     } catch (IOException e) { 
      System.err.println("Could not start up on: " + "4000" + "Maby server is already open? Or a portforwording messup?"); 
      System.err.println(e); 
      System.exit(1); 
     } 

     Socket client = null; 
     while(true) { 
      try { 
       client = server.accept(); 
       String IP = client.getInetAddress().toString(); 
       System.out.print(IP + " Connected\n"); 
      } catch (IOException e) { 
       System.err.println("Accept failed."); 
       System.err.println(e); 
      } 

      Thread t = new Thread(new ClientConn(client)); 
      t.start(); 
     } 
    } 
} 


class ClientConn implements Runnable { 
    private Socket client; 
    String Recv, Send; 
    DataInputStream inFromClient; 
    DataOutputStream outToClient; 

    ClientConn(Socket client) { 
     this.client = client; 
     try { 

      inFromClient = new DataInputStream(client.getInputStream()); 
      outToClient = new DataOutputStream(client.getOutputStream()); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
    } 

    public void run() { 
     try { 
      while ((Recv = inFromClient.readUTF()) != null) { 

       System.out.print("Msg: " + Recv + " \n"); 
       if(Recv.equals("Hi")){ 
        Send = "Welcome"; 
       } 
       else{ 
        Send = "Wat?"; 
       } 

       outToClient.writeUTF(Send); 
       System.out.print("Replying:" + Send + "\n"); 
      } 
     } catch (IOException e) { 
      System.out.print("No input "); 
      System.err.println(e); 
     } 
    } 

} 

這實際上是混淆了我:(....

回答

0

嘗試刷新的數據從發送一些數據後,服務器並試一試

outToClient.writeUTF(Send); 
outToClient.flush();//add this one 

,順便說一句,當你點擊調用get()方法時,客戶端正在等待一些消息,服務器也在等待某個消息,也許你需要發送一些東西來獲得某些東西,比如這樣。

public void Get(View view){ 
      try { 
       oos.writeUTF("What's up?!"); 
       oos.flush(); 
       sIn = ois.readUTF(); 
       serverMessage.setText("Message: " + sIn); 
      } 
      catch (Exception e) { 
      } 

    } 

順便說一下,請遵循Java的命名規則,你的方法如下M $ SI-尖銳的命名規則Get() - > get()感謝。 :)

+0

其實,沒有用.. 順便說一句,客戶端GETS消息cuz「消息可用顯示超過1每次點擊。所以問題是在某處周圍」ReadUTF「 –

+0

你會評論在那裏你認爲程序卡住了?!或者一些堆棧跟蹤..,某事......並且順便說一句,也許這是因爲服務器需要接受一條消息來回應一些消息,你在get方法中只是期望一些消息,我發送了一些東西,我更新了答案 – 2013-10-05 17:37:16

+0

程序在客戶端的「ReadUTF」似乎是錯誤的,因爲我說「ois」的大小隨着發送到服務器的每條消息而增加,這意味着實際上有一些消息被傳回但sIn字符串變量以某種方式不會將該消息分配給自己... –

相關問題