package com.example.chatactivity;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.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity implements Runnable{
private EditText ipaddr;
private EditText recvmsg;
private EditText sendmsg;
private Button send;
private Button start;
private Button stop;
private String ip;
private String sendtext;
private String recvtext;
Socket socket;
Thread thread;
DataInputStream in;
DataOutputStream out; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ipaddr=(EditText)findViewById(R.id.iptext);
recvmsg=(EditText)findViewById(R.id.recvtext);
sendmsg=(EditText)findViewById(R.id.sendtext);
send=(Button)findViewById(R.id.send);
start=(Button)findViewById(R.id.start);
stop=(Button)findViewById(R.id.stop);
stop.setEnabled(false);
send.setEnabled(false);
start.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ip=ipaddr.getText().toString();

thread=new Thread(MainActivity.this);
thread.start();
//start.setEnabled(false);
//stop.setEnabled(true);
//send.setEnabled(true);
}
});
send.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sendtext=sendmsg.getText().toString();
if(sendtext!=null){
try {
out.writeUTF(sendtext);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
stop.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
in.close();
out.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stop.setEnabled(false);
start.setEnabled(true);
send.setEnabled(true);
}
});
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public void run() {
// TODO Auto-generated method stub
try {
socket=new Socket(ip,8000);
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//Toast.makeText(this, "host name could not be resolved into an IP address", Toast.LENGTH_SHORT);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true){
try {
recvtext=in.readUTF();
mHandler.sendMessage(mHandler.obtainMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Handler mHandler=new Handler(){
public void handleMessage(Message msg){
recvmsg.append(recvtext);
super.handleMessage(msg);
}
};}
总是连不上服务器,而且在虚拟机里点start按钮程序出错停止

解决方案 »

  1.   

    主线程里只是声明和定义了socket一些变量,接受实在新建的线程里,这样也不行吗
      

  2.   

    主线程里只是声明和定义了socket一些变量,接受实在新建的线程里,这样也不行吗
    看错了,sorry
    两个建议:
    1.最好在真机上调试。
    2.3个edittext在使用前都没做空指针判断,容易导致空指针异常。你看一下应用挂掉是不是这个原因。
      

  3.   

    主线程里只是声明和定义了socket一些变量,接受实在新建的线程里,这样也不行吗
    看错了,sorry
    两个建议:
    1.最好在真机上调试。
    2.3个edittext在使用前都没做空指针判断,容易导致空指针异常。你看一下应用挂掉是不是这个原因。主线程里只是声明和定义了socket一些变量,接受实在新建的线程里,这样也不行吗
    看错了,sorry
    两个建议:
    1.最好在真机上调试。
    2.3个edittext在使用前都没做空指针判断,容易导致空指针异常。你看一下应用挂掉是不是这个原因。我刚学,还不会看Logcat,我先试试是不是空指针问题
      

  4.   

    不太会调试,ipaddr在这个文本框里填完IP地址后,点击start按钮,程序在socket=new Socket(ip,8000);执行部下去了。不填ipaddr文本框,程序执行到in=new DataInputStream(socket.getInputStream());执行不下去了,socket为null
      

  5.   

    试试udx协议,http://www.goodudx.com/web/index.php/site/download/25,安桌开发包。
      

  6.   


    socket=new Socket(ip,8000);
    in=new DataInputStream(socket.getInputStream());
    out=new DataOutputStream(socket.getOutputStream());这个改成 
    socket= new Socket();
    socket.connect(new InetSocketAddress(ip,8000));
    in=new DataInputStream(socket.getInputStream());
    out=new DataOutputStream(socket.getOutputStream());
    然后把这个放到线程里面就可以了。
    while(true){
    try {
    recvtext=in.readUTF();
    mHandler.sendMessage(mHandler.obtainMessage());
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    这个代码有漏洞,如果异常了应该退出循环,重新连接socket