import java.net.ServerSocket;
import java.net.Socket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv;
Socket socket;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
System.out.println("-----halder-----2-----------");
if (msg.what == 1) {
System.out.println("---------------handle-----3");
String str = (String) msg.obj;// 子线程中socket取出来的字符串传到主线程
System.out.println(str+"----------str--------------");
tv.setText(str);// 把字符产放到TextView里
} else if (msg.what == 2) {
System.out.println("----------555--------------");
new Thread(new AndroidRunable(socket, handler)).start();
}
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTv((TextView) findViewById(R.id.aip));
System.out.println("-----------main--------1-------");
try {
System.out.println("-----------main--------2-------"); final ServerSocket serivce = new ServerSocket(8080);
new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println("-----------main--------3-------"); socket = serivce.accept();
System.out.println("-----------main--------4-------");

handler.sendEmptyMessage(2); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
// new Thread(new AndroidService(serivce , handler)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 创建一个ServerSocket,用于监听客户端Socket的连接请求 } public TextView getTv() {
return tv;
} public void setTv(TextView tv) {
this.tv = tv;
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import android.os.Handler;
import android.os.Message;
public class AndroidRunable implements Runnable { Socket socket = null;
Handler handler = null; public AndroidRunable(Socket socket, Handler handler) {
this.socket = socket;
this.handler = handler; } @Override
public void run() {
// 向android客户端输出hello world
String line = null;
InputStream input;
OutputStream output;
String str = "hello world!";
System.out.println("----Lianjei-----------8");
Message message = new Message();
System.out.println("----Lianjei-----------9");
try {
// 向客户端发送信息
 output = socket.getOutputStream();
System.out.println("----Lianjei-----------10");
input = socket.getInputStream();
System.out.println("----Lianjei-----------11");
BufferedReader bff = new BufferedReader(new InputStreamReader(
input));
System.out.println("----Lianjei-----------12");
output.write(str.getBytes("gbk"));
output.flush();
// 半关闭socket
socket.shutdownOutput();
//获取客户端的信息
line = bff.readLine();
System.out.println(line + "------------------------");
while ((line = bff.readLine()) != null) {
System.out.println("----Lianjei-----------13");
message.what = 1;
message.obj = line;
handler.sendMessage(message); }
// 关闭输入输出流
output.close();
bff.close();
input.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
} }
}
服务器能和客户端建立连接,但是客户端不能向服务器端发数据,然后我单步调试,程序没问题,但是总的运行就不行了
求大神帮忙看下

解决方案 »

  1.   

    嗯嗯  是啊 因为我实现的功能比较简单  我想让客户端和服务器实时通信,
    问题在于不知道为什么 我把启动为客户端服务的子线程写在死循环里
    while(true){
     new Thread(new AndroidRunable(socket, handler)).start();
    }
    这样 我的客户端就连一下就自动断开,不能长时间连接服务器。
    但是把while(true)给去掉,就能正常连接服务器  但是传数据的话不能实时传输
      

  2.   

    好吧。我还真没试过把手机做为服务器,不发表评论。不过,我的做法是,用PC做服务器,然后手机连到PC上去,做数据交互的。
      

  3.   

    就是TCP通信 。在我看来没啥区别。
      

  4.   

    pc端先用tcp/udp调试软件。如果手机端收不到数据,手机端程序就有问题。android客户端也是有调试软件的,然后测试pc端,这种方式测试先确定哪一端是瞎子。还是都是瞎子。
    while(true){
     new Thread(new AndroidRunable(socket, handler)).start();
    }
    这段代码是不是一直在new 一个线程。这个开销逻辑我觉得很不合理。还有AndroidRunable这个线程执行任务,任务执行一次就结束关闭了。收不到数据不奇怪。
      

  5.   

    WIFI环境下是可以的。如果使用手机移动网络就不行,我ping过手机的ip ping不通,我也没有搞明白使用手机移动网络怎么建立socketServer
      

  6.   

    socket保持长连接是需要用到心跳包,定时的发送心跳数据,但android的系统机制好像在进入后台运行时会因为等级不够而被杀掉,应用持续在前台应该没有问题