在写项目的时候遇到一个很棘手的问题,就是加载广告图片的时候,有多个连结同时访问服务器,在返回数据的时候总是只有一个广告线程能返回数据,另一个不能返回,需要让第二个广告线程sleep两秒以上才可以得到广告图片,是一个很纠结的问题,谢谢大神指点`package
public class SocketToService {
public static final Object SOCKETERROR = "#0x123";
public Socket socket =new Socket();
private BufferedReader reader;
private InputStream socketin;
private BufferedWriter writer;
private static int i =0;//端口地址表示
private StringBuffer buffer;//返回报文
/**
* @param dstName 服务器地址
* @param dstPort 服务器端口
* @param putXml 发送的报文
* @TODO 发送报文到服务器并接收返回报文
* @throws UnknownHostException
* @author yb
* @throws IOException
* @Reten #0x123表示端口错误
*/
static boolean flag = true;
/**
* @Title: todoService
* @Description: 连接服务器
* @param dstName
* @param dstPort
* @param putXml
* @return
* @author yb
* @return String
*/
public String todoService(String dstName,int[] dstPort,String putXml){
buffer=new StringBuffer();
try {
//发送报文
if (flag) {
System.out.println(new InetSocketAddress(dstName,dstPort[0]));
socket.connect(new InetSocketAddress(dstName,dstPort[0]),3000);
}else{//连接错误后调用备用端口
System.out.println(i);
System.out.println(new InetSocketAddress(dstName,dstPort[i]));
socket.close();//关闭无法使用的Socket
socket=new Socket();
socket.connect(new InetSocketAddress(dstName,dstPort[i]),3000);//设置连接并设置超时时间
}
doAction(socket, putXml);//连接成功调用访问机制
}
catch (IOException e2) {
flag=false;
if (i<dstPort.length) {//判断dstPort是否数组越界
i++;
if (i==dstPort.length) {//如果遍历完备用端口为连接返回错误信息:#0x123
return buffer.append(SOCKETERROR).toString();
}
}
todoService(dstName, dstPort, putXml);//执行回调方法
}finally{
try {
//重置状态
flag=true;
i=0;
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return buffer.toString();
}
/**
* @TODO 报文发送和接收机制
* @param socket
* @param putXml
*/
private void doAction(Socket socket,String putXml){
String content;
try {
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("发送报文:"+putXml);
writer.write(putXml.toCharArray());
writer.flush();
socket.shutdownOutput();//关闭输出流
//读取返回的报文
socketin = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(socketin));
while ((content=reader.readLine())!=null) {
buffer.append(content);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public boolean isConn(){
return socket.isClosed();
}
public void closeConn(){
if (socket!=null) {
try {
socket.close();
} catch (IOException e) {
LogUtil.e("error", e.getMessage());
}
}
}
}