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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
从网络接口获取json数据不完全
也就是说当我们从一个接口获取到json数据的时候想打印一下,但是当我们和网页上查看到的内容对比一下会发现(有可能)我们打印的仅仅是前半部分。 可能的原因: * 这当然可能是你没有获取完全 * 我们的Json数据很长,但是由于AndroidStudio 中 LogCat的限制,所能输出的字符是有限的(我并没有去了解具体的限制——是通过吧内容显示到TextView中知道我获取的数据没有错——也就是
Socket发送并接收服务器返回的数据
Socket发送并接收服务器返回的数据 个人整理
fragment当切换页面的时候,页面的UI信息没有了,然后再次切换这个页面的时候,又变回原来没有登录的状态的界面
现在稍有头绪的使用方法是用onSaveInstanceState(Bundle outState) 和onViewStateRestored(Bundle savedInstanceState)的这两个方法来进行UI状态的保存和取出,直接把UI的字符串值传入Bundle中,但是取数据和保存数据条件该写什么? 还有,这里不应该使用onStart()和onPause()方法来保存这样的UI界面数据,
bug解决:android app内部请求接口返回500,但是浏览器返回200
遇到个问题,android app内部请求接口返回500,但是浏览器请求同样的接口返回200,而且都只是get请求,参数也都没问题,但是就是返回的东西不一样。 查了一天,终于看到这个贴 http://ask.csdn.net/questions/187263,是请求头的问题,两种请求头不一样,最后把浏览器请求头参数都试了一遍,找到了,设置了 Accept-Language: zh-CN,...
Vue2.4.0+vue-source+express解决获取数据不成功问题
旧版本代码如下:var vm=new Vue({ el:'.book', data:{ books:[] }, ready() { this.resource=this.$resource("/books{/id}"); this.resource.get().th
服务器端返回数据处理
JSON服务端数据接收 通过ajax获取服务端发送过来的数据 根据接收到的数据获取需要的数据 将JSON格式转化为对象JSON.parse(d.template) 根据对象获取数据 例子: 将获取到的数据保存为需要的对象格式var selectList = [];function initData(data) { $.each(data, function (i, d) {
TCP accept返回的socket,服务端TCP连接数限制
http://www.cppblog.com/aa19870406/archive/2012/07/15/183595.html socket accept()返回的socket描述符的端口和listen描述符端口是一样的吗? as you know,一个socket是由一个五元组来唯一标示的,即(协议,server_ip, server_port, client_ip, client
关于Socket通信中多个线程同时向一个服务端口发送数据时的注意点
近几天在开发的程序里面有相关模块使用到了Socket通信,其中存在多个类似功能的模块,这些模块可能出现在同一时间段向一个服务端端口发送消息的情况,刚开始使用一个socket去通信,结果发现异常频繁出现.(事实上,当发送间隔很长,比如每200ms才会有一次发送,那么两个线程之间冲突的机会很小,基本上不会冲突.但是不冲突就不代表问题不存在,当发送间隔缩小到20ms时,异常发生的几率就非常大了,因此不管
Recv 返回10054的原因及解决
开发中遇到问题,Recv 出错,返回10054用sniffer 抓包分析,正常交易以FIN 4次握手结束,该交易服务器以返回RST 结束。查找资料,为什么返回RST。有一种原因是接收缓冲区中还有数据,此时调用closesocket,就会返回RST,而不是正常的FIN四次握手结束。看一下程序,发送时确实多发了几个字节。服务器根据定长报文格式只取了前面的内容,调用closeso
socket编程中write返回-1的问题
<br />作为服务器,有客户端连接进来。TCP协议。<br />当客户端断开连接的时候,按道理说write将会不成功的。<br />那么当write不成功的时候是应该返回-1的。<br /> <br />实际情况是,当客户端断开的时候,write仍然会成功,再下一次才会失败。<br />而失败了之后,进程就结束掉了。没有返回-1.<br /> <br />google之后知道:<br />客户端关掉之后,再往这个文件描述符中写东西会引发一个SIGPIPE信号,这个信号的默认动作就是让进程结束掉。……。好吧