Android socket通讯有关问题,请朋友们帮帮忙

Android socket通讯问题,请朋友们帮帮忙
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按钮程序出错停止

------解决方案--------------------
网络操作要在子线程里做,不能放在UI主线程。
------解决方案--------------------
引用:
Quote: 引用:

网络操作要在子线程里做,不能放在UI主线程。

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

看错了,sorry
两个建议:
1.最好在真机上调试。
2.3个edittext在使用前都没做空指针判断,容易导致空指针异常。你看一下应用挂掉是不是这个原因。