问题描述:
业务需求是有一个报文数组,我遍历该数组,每取到一个报文串,便通过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连接】");
}
}
你可以使用多点广播套接字
socket=new MulticastSocket(port);//port为端口
自己顶一下,没人遇到过这样的问题么
兄弟你这个问题解决了吗?我也碰到了,我快郁闷死了,换了流,设了超时间都不行,如果两个请求发的间隔很小的话才能正常收到,一长就收不到了,
楼主解决了么,跪求啊
正遇到这个问题,求解啊
请问大神怎么解决socket问题 我的情况是 for循环socket请求 只响应最后一次的得到的数据 前面的没有数据返回 这是什么情况 谢谢