2014-09-23 141 views
1

我正在制作一个简单的echo服务器/客户端应用程序。服务器站点是一个Java应用程序,客户端站点是一个Android应用程序。Echo服务器/客户端Java和Android应用程序

客户端旨在显示用户通过Toast消息通过服务器站点发送的内容。但问题在于信息总是延迟。

发送消息后的第一时间,敬酒的消息我是“空”,第二次它表明我发送的第一次...

这让我很困惑的消息...谢谢你帮助我!

Client: 

public class Client extends Activity implements View.OnClickListener { 

EditText editText; 
Button button; 

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

    editText=(EditText)findViewById(R.id.editText); 
    button=(Button)findViewById(R.id.button); 
    button.setOnClickListener(this); 
} 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.client, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onClick(View view) { 
    Thread thread = new Thread(){ 
     @Override 
     public void run(){ 
      try { 
       Socket socket = new Socket("192.168.1.65",1234); 
       DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
       DataInputStream dis = new DataInputStream(socket.getInputStream()); 
       dos.writeUTF(editText.getText().toString()); 
       dos.flush(); 
       string2 = dis.readUTF().toString(); 
        dos.close(); 
       dis.close(); 
       socket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 

    }; 
    thread.start(); 

    Toast.makeText(this,""+string2,Toast.LENGTH_SHORT).show(); 

    Toast.makeText(this, "Message sent!", Toast.LENGTH_SHORT).show(); 
} 

}

Server: 

public class Server { 

static Socket socket =null; 

public static void main(String[] args) { 
    Thread thread = new Thread() { 
     @Override 
     public void run(){ 
      System.out.println("Server is on "); 
      try { 
       ServerSocket serversocket = new ServerSocket(1234);     
       while(true){ 
        socket = serversocket.accept(); 

        DataInputStream dis = new DataInputStream(socket.getInputStream()); 
        String string = dis.readUTF(); 
        this.sendToClient(string); 
        System.out.println("Message: "+ string); 
        dis.close(); 
        socket.close(); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

     public void sendToClient(String str) throws IOException { 

      OutputStream s = socket.getOutputStream(); 
      DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
      dos = new DataOutputStream(s); 
      dos.writeUTF(str);       

     } 

    }; 
    thread.start(); 

} 

}

回答

0

您正在这样的假设是不正确的。也就是说,在显示Toast之前,完成从服务器检索字符串的工作的线程将完成。

在onClick中,您已经开始一个后台线程,完成工作以检索string2。

但是,您立即显示一个吐司(在主UI线程上)并包含当前的string2值。由于后台线程尚未完成,因此string2尚未更新。

你应该改用AsyncTask。在doInBackground中执行DataOutputStream,并在onPostExecute中更新UI(显示Toast)。这将保证您的订单。

http://developer.android.com/reference/android/os/AsyncTask.html

有吨左右的AsyncTask其他职位在这里堆栈溢出。

+0

我明白你的意思,但我也试图让onClick的线程睡眠1秒,通常应该发送字符串。但我仍然有同样的问题... – Kkr0319 2014-09-23 23:27:42

相关问题