socket通信之eofexception

方案一:
用read()将不会抛出异常。因为read是block方式的。
readInt()抛出异常的原因(我遇到的)是对方在该端口没有消息发送。 方案二:
socket的端口被阻塞了 ,也就是我们需要更换端口号来解决. 方案三:
在初始化链接时,如果先创建输入流,再创建输出流可能会报错,正确创建顺序如下: ObjectOutputStream output=new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream input=new ObjectInputStream(socket.getInputStream()); 方案四:
从上面的提示可以模糊看到,因为不知道流的末尾,当到达末尾的时候,自然抛出了此异常。既然不知道结尾如何,干脆设一个缓存,然后读取一批数据后输出即可。
为了保险期间,可以讲此缓存设置大点,一次可以完全接收到想要的内容,这样,一次就可以读取到所要的内容了,避免了循环获取。下面将此代码放出来:
...... private static final int BUFFER_SIZE=*; ...... Socket socket = new Socket(cfg.getIp(), Integer.parseInt(SysParamsToolkit.getProperty("socketport")));
String charset = SysParamsToolkit.getProperty("socke.rexml.charset"); //Socket发送的字符集编码
try {
OutputStream dos = socket.getOutputStream();
dos.write(xmlcmd.getBytes(charset));
dos.flush();
DataInputStream dis = new DataInputStream(socket.getInputStream());
char[] data = new char[BUFFER_SIZE];
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), charset));
int len = br.read(data);
String rexml = String.valueOf(data, , len); //接收一个字符串数据
} catch (Exception e) {
return false;
} finally {
if (socket.isConnected())
socket.close();
}
...... 经过上面的处理后,就没问题了。 缓存的大小BUFFER_SIZE是根据你要接收内容的大小来确定。
上一篇:iOS app内打开safari完成google的OAuth2认证


下一篇:MQTT协议实现Eclipse Paho学习总结二