2 yb498869020 yb498869020 于 2014.07.31 21:37 提问

android socket 多线程访问服务器有的时候会返回数据有的时候返回失败

在写项目的时候遇到一个很棘手的问题,就是加载广告图片的时候,有多个连结同时访问服务器,在返回数据的时候总是只有一个广告线程能返回数据,另一个不能返回,需要让第二个广告线程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());
        }
    }
}

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!