2012-06-21 47 views
1

我正在为Android设备开发TCPclient。 我可以连接到服务器,并且可以跟踪我从服务器收到的消息。 我想显示与TextView textview_textin在TextView中的Android TCP客户端读取套接字

上的客户端GUI服务器发送的处理结果,你能不能帮我做

非常感谢

public class JssclientActivity extends Activity { 
private EditText serverIp; 

private Button connectPhones; 

private String serverIpAddress = "192.168.0.2"; 

private boolean connected = false; 

private TextView textview_textin; 



public class ClientThread implements Runnable { 

    public void run() { 
     try { 

      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      Log.d("ClientActivity", "C: Connecting..."); 
      Socket socket = new Socket(serverAddr, 2600); 
      connected = true; 
      while (connected) { 
       try { 

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        String inMsg = ""; 
        char buf[] = null; 
        int val = in.read(); 
        while (-1 != val) { 
         inMsg = in.readLine(); 
        } 

       } catch (Exception e) { 
        Log.e("ClientActivity", "S: Error", e); 
       } 
      } 
      socket.close(); 
      Log.d("ClientActivity", "C: Closed."); 
     } catch (Exception e) { 
      Log.e("ClientActivity", "C: Error", e); 
      connected = false; 
     } 
    } 
} 


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

    textview_textin = (TextView) findViewById(R.id.textin); 
    connectPhones = (Button) findViewById(R.id.connect); 

    connectPhones.setOnClickListener(new View.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 JssclientActivity extends Activity { 
private EditText serverIp; 

private Button connectPhones; 

private String serverIpAddress = "192.168.20.21"; 

private boolean connected = false; 

private TextView textview_textin; 

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

    textview_textin = (TextView) findViewById(R.id.textin); 
connectPhones = (Button) findViewById(R.id.connect); 



ClientThread ct = new ClientThread(new ClientThread.SocketCallback() { 
     public void onReceived(final String msg) { 
     JssclientActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       textview_textin.setText(msg); 
      } 
     }); 
     } 
    }); 

    } 
} 




class ClientThread implements Runnable { 

interface SocketCallback { 
    void onReceived(String msg); 
} 
private SocketCallback callback; 

private boolean connected; 

private Socket socket; 

public ClientThread(ClientThread.SocketCallback cb) { 
     this.callback = cb; 
     try {InetAddress serverAddr = InetAddress.getByName("192.168.20.21"); 
     Log.d("ClientActivity", "C: Connecting..."); 
     //Socket 
    socket = new Socket(serverAddr, 2600); 
     connected = true; 
     } catch (Exception e) { 
      Log.e("ClientActivity", "C: Error", e); 
      connected = false; 
     } 
    } 

public void run() { 
     while (connected) { 
      try { 

       BufferedReader in = new BufferedReader(new  InputStreamReader(socket.getInputStream())); 
       String inMsg = ""; 
       char buf[] = null; 
       int val = in.read(); 
      //  while (-1 != val) { 
      //  inMsg = in.readLine(); 
      // } 
       while (-1 != val) { 
        inMsg = in.readLine(); 
        this.callback.onReceived(inMsg); 
       } 

      } catch (Exception e) { 
       Log.e("ClientActivity", "S: Error", e); 
      } 
     } 
    // socket.close(); 
     Log.d("ClientActivity", "C: Closed."); 

} 
} 

请你能帮助我吗?

感谢

+0

您应该编辑您的问题并重新放置查询,而不是将其作为答案。所以我建议删除这个答案,并编辑你的主要问题,因为用户来到这个帖子将检查问题不是这样,所以它会更好地获得rellavent答案。 – MKJParekh

回答

0

您可以使用它的方法setText()设置一个TextView的文本。

例子:

textview_textin.setText(yourText) 

使用runOnUiThread()您将能够访问你的TextView。见this answer

1

创建一个回调类,

interface SocketCallback { 
    void onReceived(String msg); 
} 

这可能是一个内部的ClientThread,因为他们有逻辑关系。这不是必需的,但它是很好的设计。

有你的Runnable类在它的构造函数中接受这个回调的一个实例。

public ClientThread(ClientThread.SocketCallback cb) { 
    this.callback = cb; 
} 

当你构建你的RunnableClientThread),从你的UI类(JssClientActivity)这样做,这样,

ClientThread ct = new ClientThread(new ClientThread.SocketCallback() { 
    public void onReceived(String msg) { 
    JssClientActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     myTextView.setText(msg); 
     } 
    }); 
    } 
}}; 

最后,在ClientThread,当您收到一条消息,调用回调,

while (-1 != val) { 
    inMsg = in.readLine(); 
    this.callback.onReceived(inMsg); 
} 

请注意,您无法从运行ClientThread的线程更新UI。它必须从UI线程更新,因此致电runOnUiThread()

+0

感谢您的回复, – Vestaproman

+0

如果这回答了您的问题,请点击答案左侧复选标记的大纲接受它。 –