初始化语句 socketThread = new SocketThread(Datahandler);
socketThread.setSocketThreadStatus(true);
new Thread(socketThread).start(); receiveThread =  new ReceiveThread(socketThread.GetSocket());
new Thread(receiveThread).start();


socket实现
public class SocketThread implements Runnable
{
private Handler handler;
private byte[] sendbuff;
private Boolean Socketstatus =false;
private Handler SocketHandler;

Socket socket;
BufferedReader bufferreader;
InputStreamReader inputStreamReader;

InputStream inputstream;
OutputStream outputStream;





public SocketThread(Handler handler) 
{
Log.v("系统状态", "创建发送线程");
socket = new Socket();
this.handler = handler;
// TODO Auto-generated constructor stub
}
public Socket GetSocket()
{
return socket;
}
public Handler GetSocketHandler()
{
Log.v("系统状态", "STEP3");
return SocketHandler;
}
public void setSocketThreadStatus(Boolean bool)
{
if(bool)
{
Socketstatus =true;
}
else
{
Socketstatus =false;
}
}
@Override
public void run() 
{
sendbuff =new byte[10];

if(socket.isClosed())
{
socket =new Socket();
Log.v("系统状态", "建立SOCKET");
} SocketAddress socketAddress = new InetSocketAddress("192.168.1.101", 30000);

try 
{
socket.connect(socketAddress, 2000);
Log.v("系统状态", "建立连接");

catch (IOException e) 
{
socket =new Socket();
Log.v("系统状态", "exception 建立socket");
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.v("系统状态", "SocketThread is runing");
//Log.v("系统状态", "STEP4");
Looper.prepare();

SocketHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//Log.v("系统状态", "收到handler");
switch(msg.what)
{
case 0: sendbuff = (byte[]) msg.obj;
//Log.v("系统状态", "收到数据更新");
if(socket.isConnected())
{
try {
outputStream = socket.getOutputStream();
outputStream.write(sendbuff);
Log.v("系统状态", "发送一次数据");
//
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.v("系统状态", "发送数据失败");
}
// }
else
{
Log.v("系统状态", "连接不存在");
}
break;
case 1:
sendbuff = (byte[]) msg.obj;
//Log.v("系统状态", sendbuff.toString());
break;
case 2:
sendbuff = (byte[]) msg.obj;
//Log.v("系统状态", sendbuff.toString());
break;
case 3:
sendbuff = (byte[]) msg.obj;
//Log.v("系统状态", sendbuff.toString());
break;
case 4:
sendbuff = (byte[]) msg.obj;
//Log.v("系统状态", sendbuff.toString());
break;
case 5:
sendbuff =msg.obj.toString().getBytes();
//Log.v("系统状态", sendbuff.toString());
break;

} }
};

Looper.loop();
}
}receive 实现
public class ReceiveThread implements Runnable 
{
private Socket socket;
String string;
byte[] data  = new byte[10];
int receivenum;
boolean state;
public ReceiveThread(Socket socket) 
{
Log.v("系统状态", "创建接收线程");
// TODO Auto-generated constructor stub
this.socket = socket;
}

public void run() 
{

int receivenum; try {
while(true)
{
Log.v("系统状态", "ReceiveThread is runing");
receivenum =socket.getInputStream().read(data);

if(receivenum>0)
{
Log.v("系统状态", "收到一次数据");
}
else
{
Log.v("系统状态", "未收到数据");
}
}

catch (IOException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
} };}上边就是源码。目前的状态是,发送时候服务器可以收到,但是服务器的回复,这边收不到。
接收线程的Log.v("系统状态", "ReceiveThread is runing");只会显示一次,后续就再也没有了。
没有收到任何数据。
请教是什么原因

解决方案 »

  1.   

    我今天早上重写了个JAVA的服务器测试,服务器可以收到数据,服务器收到数据后发回,程序也依然收不到数据,感觉好像接收线程根本就没有运行。
      

  2.   

    我今天早上重写了个JAVA的服务器测试,服务器可以收到数据,服务器收到数据后发回,程序也依然收不到数据,感觉好像接收线程根本就没有运行。
      

  3.   

    我发的是安卓的客户端的程序,我用一个路由器,把安卓和自己的电脑都加在局域网中,然后用电脑写了个JAVA的服务器,通过安卓的客户端访问服务器
      

  4.   

    试着改了下,不保证能用;
    接收时,因为还没连上,报错了,因为你try在循环外,出错会直接跳出循环,接收线程就结束了;
    另外我觉得,你连接上的socket对象和你接收时的对象可能不是同一个,所以改成了现在这样
    最后,接收这里是死循环,楼主自己考虑怎么跳出吧public class ReceiveThread implements Runnable {
    private SocketThread socketThread;
    String string;
    byte[] data = new byte[10];
    int receivenum;
    boolean state; public ReceiveThread(SocketThread socketThread) {
    Log.v("系统状态", "创建接收线程");
    // TODO Auto-generated constructor stub
    this.socketThread = socketThread;
    } public void run() { int receivenum; while (true) {
    Log.v("系统状态", "ReceiveThread is runing");
    try {
    receivenum = socketThread.GetSocket().getInputStream().read(data);

    if (receivenum > 0) {
    Log.v("系统状态", "收到一次数据");
    } else {
    Log.v("系统状态", "未收到数据");
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    try {
    Thread.sleep(100);//出错的话,一般是还没连接上,这里先等等
    } catch (InterruptedException e1) {
    }
    }
    } };}
      

  5.   

    处理服务器返回数据的线程你要写在第一个线程里面最后面。如果你写了一个run().star他很可能会同时运行啊。不知道你内部代码怎么处理的。
      

  6.   


    我从服务器读到数据后,直接通过handler发送给主线程了,由主线程去刷新UI的数据。
      

  7.   

    这个程序我试了下,不行。我查了下,确实存在连接未建立,跳出exception的问题,我通过在发送线程建立后延时的方法解决了这个问题,依然通过log观察,依然接收不到数据。我的发送是按照固定频率一直不停的向服务器发送,所以接收应该是一直接收的,应该不需要退出死循环吧。