Android Socket通讯问题

用Socket接收数据,点击button启动线程开始接收数据,第一次没有问题,能收到数据,第二次第三次就不行了,连接成功但是没有数据返回,程序正常退出之后再次进入也不行,但是程序异常退出之后第一次点击button接收数据能够成功,之后的又不行了,请问各位前辈该怎么处理

你这个本身程序设计问题,连接成功以后,线程负责监测信息的进出就行了,或者用随开随关的方式,你本身已经用端口打开了,端口就被占用了,然后你点击又用端口打开肯定不行的。

贴出线程的代码吧,不然不知道问题出在哪里,还有第一次和第二次、第三次是什么操作,是点击button的次数还是服务器发消息次数

//点击button启动的线程
@Override
public void run() {
// TODO Auto-generated method stub
// super.run();
mSocket = new Socket();
remoteAdress = new InetSocketAddress(ip, port);
try {
// mSocket.setKeepAlive(true);
mSocket.connect(remoteAdress, 3000);
mInputStream = mSocket.getInputStream();
mOutputStream = mSocket.getOutputStream();
mSocket.setSoTimeout(3000);
} catch (Exception e) {
// TODO: handle exception
if (D) {
Log.d(TAG, "中心线程错误");
if (mSocket != null) {
try {
mSocket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
mInputStream = null;
mOutputStream = null;
} finally {
ReadThread mreadThead = new ReadThread();
mreadThead.start();
SendThread s = new SendThread();
s.start();
}
}

//读取数据的线程
public class ReadThread extends Thread {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        while (isrun) {

            if (mInputStream != null) {
                try {
                    byte[] buffer = new byte[mInputStream.available()];
                    bytes = mInputStream.read(buffer);


                    if (bytes > 4) {
                        AnalysisData.myHander = mhandler;
                        AnalysisData.parseReceiveData(buffer);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else

                try {
                    Thread.sleep(10000);

                    ConntSub();

                } catch (InterruptedException e) {

                    e.printStackTrace();
                }
        }}}

你点button是再次连接服务器吗,那你这样试试,接收数据的线程不要用while,点击一次button建立一次连接并接收数据后本次连接处理完成后,就把所用的线程停止结束掉
再点击第二次看看,应该是你第一次连接还没有全部结束就又开启了连接

为什么异常退出再打开可以呢?因为,异常退出强行关闭了端口,所以就可以了。如果是正常退出,你的application还在,端口依然被占用。

你可以试试,正常退出,然后用系统设置强行终止程序,然后打开,肯定又可以的