2 u011855528 u011855528 于 2014.08.12 14:53 提问

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个回答

u012876323
u012876323   2015.06.25 14:51

兄弟你这个问题解决了吗?我也碰到了,我快郁闷死了,换了流,设了超时间都不行,如果两个请求发的间隔很小的话才能正常收到,一长就收不到了,

xiaofeifeiloving
xiaofeifeiloving   2014.08.13 18:17

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

u011855528
u011855528 这个广播套接字不合适吧。我这个是点对点通信,不涉及也不可能广播
大约 3 年之前 回复
u011855528
u011855528   2014.08.19 09:42

自己顶一下,没人遇到过这样的问题么

u012950275
u012950275   2017.04.06 18:22

楼主解决了么,跪求啊

u014240783
u014240783   2017.05.21 20:50

正遇到这个问题,求解啊

android_happy
android_happy   2017.07.03 11:39

请问大神怎么解决socket问题 我的情况是 for循环socket请求 只响应最后一次的得到的数据 前面的没有数据返回 这是什么情况 谢谢

Csdn user default icon
上传中...
上传图片
插入图片