初始化语句 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");只会显示一次,后续就再也没有了。
没有收到任何数据。
请教是什么原因
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");只会显示一次,后续就再也没有了。
没有收到任何数据。
请教是什么原因
解决方案 »
- 有关GPS_PROVIDER和NETWORK_PROVIDER的问题
- 请教下安卓大神,类似于北京地铁里的显示界面好做吗?
- Android程序员目前全国各地工资待遇怎么样?
- android 视频播放有声音无图象是什么原因?
- GIT如何取下以前的版本库
- seekbar问题。。
- 请教textview固定长度,里面有表情图片,怎样才能使得表情图片不被截断
- activity背景图占用内存太大怎么优化
- android 模拟登录教务系统 获取课程表 出错
- android 界面切换默认模式更改
- android-Conversion to Dalvik format failed with error 1
- listview控制内部控件显示隐藏
接收时,因为还没连上,报错了,因为你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) {
}
}
} };}
我从服务器读到数据后,直接通过handler发送给主线程了,由主线程去刷新UI的数据。