yb498869020 2014-07-31 13:37 采纳率: 0%
浏览 2376

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());
        }
    }
}

}

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号
    • ¥50 安装pyaudiokits失败
    • ¥15 计组这些题应该咋做呀
    • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?