toephy 2014-08-12 06:53 采纳率: 0%
浏览 6312

socket循环发送请求并读取响应时,循环到第二次之后就读不到响应内容

问题描述:
业务需求是有一个报文数组,我遍历该数组,每取到一个报文串,便通过socket发送至服务端处理,然后读取服务端响应的报文。但是经过反复测试,每次循环第一次的流程是正常的,但是循环到第二次之后,却读不到响应的报文(内容为空)。求各路神仙大虾帮我看看(PS:我看过网上很多的帖子,有的人说socket输入流就像一个一次性的杯子,只能使用一次。但是按这样的话,我岂不是每次发送都需要建立socket连接?这样太消耗资源了吧)。

这是我的业务逻辑代码
public void sendReq(String[] RequestXml) throws Exception{
Messenger messenger = new Messenger(SERVERIP, SERVERPORT, TIMEOUT, "UTF-8");
for (String requestXML : RequestXml) {
String response = messenger.sendReq(requestXML);
System.out.println(response);
}
messenger.close();
}
下面是我的socket发送类代码
public class Messenger {
private static final Logger logger = Logger.getLogger(Messenger.class);

private Socket soc;
private PrintWriter pw;
private BufferedReader sin;
private String charset;

/**
 * 初始化连接
 * @param serverIp  连接IP
 * @param serverPort    连接端口
 * @param timeout   超时时间
 * @param charset   编码格式
 * @throws Exception
 */
public Messenger(String serverIp, int serverPort, int timeout, String charset) throws Exception {
    this.soc = new Socket(serverIp, serverPort);
    this.charset = charset;
    soc.setSoTimeout(timeout);
    soc.setKeepAlive(true);
}

/**
 * 发送报文
 * @param reqXML    待发送的报文
 * @return
 */
public String sendReq(String reqXML) {
    StringBuffer responseStr = new StringBuffer("");
    PrintWriter pw = null;
    BufferedReader sin =null;
    try {
        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc.getOutputStream(), charset)));
        sin = new BufferedReader(new InputStreamReader(soc.getInputStream(), charset));
        logger.info("【开始发送报文】");
        pw.println(reqXML);
        pw.flush();
        logger.info("【报文发送完毕】");
        String str;
        while((str = sin.readLine()) != null) {
            responseStr.append(str);
        }
        logger.info("【成功读取响应报文】");
    } catch(Exception e) {
        logger.warn("【读取响应报文时出错】" + e);
    } finally {
        if (pw != null) {
            pw.close();
        }
        if (sin != null) {
            try {
                sin.close();
            } catch (IOException e) {}
        }
    }
    return responseStr.toString();
}

//关闭连接
public void close() {
    if (pw != null) {
        pw.close();
    }
    if (sin != null) {
        try {
            sin.close();
        } catch (IOException e) {}
    }
    if (soc != null) {
        try {
            soc.close();
        } catch (IOException e) {}
    }
    logger.info("【关闭SOCKET连接】");
}

}

  • 写回答

6条回答

  • xiaofeifeiloving 2014-08-13 10:17
    关注

    你可以使用多点广播套接字
    socket=new MulticastSocket(port);//port为端口

    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧