精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-11-28
happysoul 写道 truekbcl 写道 我只觉得楼主很2。
楼主都说了 是粘贴别人的代码 拜托回复消息稍微看一眼文字 乱喷 这写法是没有问题的 只是写java的人看着会觉得奇葩而已 java比c的写法 就是内存的自动回收部分会看着让写C的人一时不能习惯 如果你写js的话也会遇到内存不释放的情况 必须手动将使用的变量置为null 尤其体现在低版本的IE上面,仅仅是刷新页面都会让内存暴增 就举个列子来看看c语言程序员在写java时候的守旧的思想吧·· ---------------------------------- 请仔细想想这句话。 |
|
返回顶楼 | |
发表时间:2014-11-28
好多年没看到java程序员 吐槽别人的代码风格了.
java程序员一般不都是被吐槽写的罗嗦老土么.... |
|
返回顶楼 | |
发表时间:2014-11-29
最后修改:2014-11-29
u013830484 写道 最近看公司的源码,早就知道初期的源码是一帮c语言的人勉强写的了,过不其然,就举个列子来看看c语言程序员在写java时候的守旧的思想吧··
ArrayList<TaskInfo> list = new ArrayList<TaskInfo>(); TaskInfo personal_task_info = new TaskInfo(); personal_task_info.mstrID = CONST_SEL_WELFARE; list.add(personal_task_info); personal_task_info = null; if(!UserInfoMgr.isTodaySignIn()) { personal_task_info = new TaskInfo(); personal_task_info.mstrID = CONST_PERSONAL_SIGNIN; list.add(personal_task_info); personal_task_info = null; } 两次personal_task_info = null;就把我弄醉了····· 给你贴一个真正的 C/C++ 程序员的JAVA代码: import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 日期对象与字符串对象相互转换类 * @Package com.net263.ccap.common.util * @File DateUtil.java * @date 2014-10-13 下午10:35:25 */ public class DateUtil { private static final Logger log = LoggerFactory .getLogger(DateUtil.class); /** * 将字符串类型的日期转为 Date 类型 * @param dateString 字符串类型的日期 * @return {Date} 返回 null 表示输入参数错误或转换出错 */ public static Date dateOf(String dateString, String dateFormat) { if (dateString == null || dateString.isEmpty()) return null; SimpleDateFormat format; if (dateFormat != null && !dateFormat.isEmpty()) format = new SimpleDateFormat(dateFormat); else format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date; try { date = format.parse(dateString); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("invalid date format: " + dateString); return null; } return date; } /** * 将 Date 类型的日期转为 String 类开 * @param date java.util.Date 类开的日期变量 * @return {String} 转换出错则返回 空的字符串对象 */ public static String stringOf(Date date, String dateFormat) { if (date == null) return new String(); SimpleDateFormat format; if (dateFormat != null && !dateFormat.isEmpty()) format = new SimpleDateFormat(dateFormat); else format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString; try { dateString = format.format(date); } catch (Exception e) { // TODO: handle exception log.error("invalid date: " + date); return new String(); } return dateString; } /** * 将 long 类型的日期转为 Date 类开 * @param date java.util.Date 类开的日期变量 * @return {String} 转换出错则返回 空的字符串对象 */ public static Date dateOf(long dateLong, String dateFormat){ SimpleDateFormat format; if (dateFormat != null && !dateFormat.isEmpty()) format = new SimpleDateFormat(dateFormat); else format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString=format.format(dateLong*1000); Date date=null; try { date=format.parse(dateString); } catch (ParseException e1) { e1.printStackTrace(); } return date; } /** * 将字符串格式的日期转为 1970 以来的毫秒数,如果要转成秒,则调用者需要自己 * 将该方法的返回值除以 1000 * @param dateString * @param dateFormat 日期格式:yyyy-MM-dd HH:mm:ss,当该参数为 null 时, * 则内部采用格式:yyyy-MM-dd HH:mm:ss * @return {long} 转换后的结果,返回值若为 -1 则表示出错 */ public static long timeOf(String dateString, String format) { if (format == null) format = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat dateFormat = new SimpleDateFormat(format); Date date; try { date = dateFormat.parse(dateString); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("invalid date: " + dateString + ", format: " + format); return -1; } long time = date.getTime(); return time; } } import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketException; import org.apache.axis.utils.ByteArrayOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.common.vo.HostVO; import com.exception.CcapException; import com.exception.ExceptionUtil; /** * 网络套接口基础通信类 * @Package com.common.socket * @File SocketClient.java * @author xxx@xxx.xxx * @date 2014-9-17 下午01:41:48 */ public class SocketClient implements Closeable { private static final Logger log = LoggerFactory .getLogger(SocketClient.class); private Socket socket = null; private HostVO host = null; public SocketClient(HostVO host) { this.host = host; } public HostVO getHost() { return host; } /** * 连接远程服务器,在进行网络读写之前必须先调用本函数连接远程服务器 * @return 连接服务器是否成功 */ public boolean connect() { socket = new Socket(); SocketAddress address = new InetSocketAddress(host.getIP(), host.getPort()); try { socket.setSoTimeout(host.getSoTimeout()); socket.setTcpNoDelay(true); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("setSoTimeout failed, host: " + host.toString()); socket = null; return false; } try { socket.connect(address, host.getConnectTimeout()); return true; } catch (IOException e) { // TODO Auto-generated catch block log.error("connect server error, host: " + host.toString()); e.printStackTrace(); try { if (socket.isConnected()) socket.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } socket = null; return false; } } /** * 关闭网络连接,调用 connect 成功后必须调用此函数关闭连接, * 否则会造成 文件描述符泄露问题 */ @Override public void close() { try { if (socket != null && socket.isConnected()) socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("close socket error"); } socket = null; } public Socket getSocket() { return socket; } public InputStream getInputStream() throws IOException { return socket.getInputStream(); } public OutputStream getOutPutStream() throws IOException { return socket.getOutputStream(); } /** * 读一个字节数据 * @return 返回所读字节的 ASCII 值,若返回值为 -1 则表示出错 */ public int readOneByte() { if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return -1; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getInputStream error, host: " + host.toString()); close(); return -1; } try { int ch = in.read(); return ch; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("read one byte error, host: " + host.toString()); close(); return -1; } } /** * 只读一次数据,所读到的数据长度不得超过限定值 * @param maxLength 所读数据的最大长度限制,即读到的数据长度不得超过此值, * 该值必须 > 0 * @return {String} 返回读到的数据,若返回 null 则表示读出错或读到 0 个字节 */ public String readOnce(int maxLength) { if (maxLength <= 0) { log.error("invalid maxLength: " + maxLength); throw new CcapException(ExceptionUtil.INVALID_PARAMS, "invalid maxLength: " + maxLength); } if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return null; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getInputStream error, host: " + host.toString()); close(); return null; } byte[] buf = new byte[maxLength]; int n; try { n = in.read(buf); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("read error, host: " + host.toString()); close(); return null; } if (n <= 0) { log.error("invalid read n: " + n + "; host: " + host.toString()); close(); return null; } try { return new String(buf, 0, n, "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 读一行数据 * @return 如果读出错则返回 null */ public String getLine() { if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return null; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getInputStream error, host: " + host.toString()); close(); return null; } BufferedReader reader; try { reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } String buf; try { buf = reader.readLine(); return buf; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("readline error, host: " + host.toString()); close(); return null; } } /** * 读以某个字符串为分隔符的数据 * @param tag 分隔符字符串 * @return 出错时返回 null;如果找到分隔符,则返回的数据中 不包含分隔串, * 仅返回数据部分;当读到的数据正好与分隔符相同时, 则 返回的 * String 对象的 length 为 0,即仅读到了分隔符 */ public String getByToken(String tag) { if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return null; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("get inputstream error, host: " + host.toString()); close(); return null; } byte[] token = tag.getBytes(); final int tagLen = token.length; byte[] buf = new byte[1024]; int nextPos = 0; for (;;) { try { byte ch = (byte) in.read(); if (ch == -1) { log.error("read error, tag: " + tag); return null; } // 如果缓冲区空间不足,则重新分配空间,将旧数据拷贝至新缓冲区 if (nextPos >= buf.length) { byte[] bufTmp = new byte[buf.length + 128]; System.arraycopy(buf, 0, bufTmp, 0, buf.length); buf = bufTmp; } buf[nextPos] = ch; // 先比较新读到字节与分隔符的最后一个字节是否相同 if (ch != token[tagLen - 1]) { nextPos++; continue; } // 从后向前比较剩余的字节是否相同 int i = tagLen - 2, currPos = nextPos - 1; nextPos++; while (currPos >= 0) { if (i <= 0) { if (nextPos == tagLen) return new String(); try { return new String(buf, 0, nextPos - tagLen, "UTF-8"); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } } // 如果有一个字节不同,则说明在当前已读数据中未读到分隔符 if (token[i] != buf[currPos]) break; i--; currPos--; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("read bye error, host: " + host.toString()); close(); return null; } } } /** * 读取指定长度的数据 * @param length 要求读到的数据长度,必须 > 0 * @return 返回 null 表示输入参数有错或读出错,未读到要求的长度 */ public String getByLength(int length) { ByteArrayOutputStream out = new ByteArrayOutputStream(); if (saveTo(out, length) == false) return null; byte[] buf = out.toByteArray(); try { out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("ByteArrayOutputStream close error"); return null; } try { return new String(buf, 0, length, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * 将指定长度的数据输出至流中,该方法要求必须读到规定字节长度的数据,否则将 * 返回 false * @param out 输出流句柄 * @param length 指定输出的长度 * @return {boolean} 返回 true 表示已经读到规定长度的数据并成功输出至输出流中, * 否则返回 false */ public boolean saveTo(OutputStream out, int length) { if (length <= 0) { log.warn("invalid length: " + length); throw new CcapException(ExceptionUtil.INVALID_PARAMS, "invalid length: " + length); } if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return false; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getInputStream error, host: " + host.toString()); close(); return false; } byte[] buffer = new byte[8192]; // 一边从输入流中读取数据,一边将数据输出至输出流中,直到达到目标数据大小 while (length > 0) { int n = length > buffer.length ? buffer.length : length; try { n = in.read(buffer, 0, n); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("read error, host: " + host.toString()); close(); return false; } if (n == -1) { log.error("read data failed, host: " + host.toString()); close(); return false; } // 将读到的数据输出至输出流中 try { out.write(buffer, 0, n); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("write data to outPutStream error"); close(); return false; } length -= n; } // 刷新输出流中的缓冲区数据 try { out.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("flush outPutStream error"); close(); return false; } return true; } /** * 发送数据 * @param buf 需要发送的数据,length 不能为 0 * @return {boolean} 发送是否成功 */ public boolean send(String buf) { if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return false; } OutputStream out; try { out = socket.getOutputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getOutputStream error, host: " + host.toString()); close(); return false; } try { out.write(buf.getBytes("utf-8")); out.flush(); return true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("write data error, host: " + host.toString()); close(); return false; } } // /////////////////////////////////////////////////////////////////////// public static boolean testReadOneByte(SocketClient client) { String data = "+OK\r\n"; if (client.send(data) == false) { System.out.println("send data error!"); return false; } int ch = client.readOneByte(); if (ch == -1) { System.out.println("read error!"); return false; } if (ch == '+') System.out.println("OK, find '+'"); else { System.out.println("error, not find '+'"); return false; } data = client.getByToken("\r\n"); if (data == null) { System.out.println("getByToken error"); return false; } System.out.println("token: " + data); return true; } public static boolean testGetLine(SocketClient client) { String data = "hello world!\r\n"; if (client.send(data) == false) { System.out.println("send data failed!"); return false; } data = client.getLine(); if (data == null) { System.out.println("getLine failed!"); return false; } System.out.println(data); return true; } public static boolean testGetToken(SocketClient client) { if (client.send("hello|name=value|\r\n") == false) { System.out.println("write filed!"); return false; } String data = client.getByToken("|"); if (data == null) { System.out.println("getByToken failed!"); return false; } System.out.println("first token: " + data); data = client.getByToken("|"); if (data == null) { System.out.println("getByToken failed!"); return false; } System.out.println("second token: " + data); data = client.getByToken("\r\n"); if (data == null) { System.out.println("getByToken failed!"); return false; } System.out.println("third getByToken(len:" + data.length() + "): " + data); return true; } public static void main(String[] args) { final String ip = "192.168.188.173"; int port = 8888; int connectTimeout = 1000; int soTimeout = 5000; HostVO host = new HostVO(ip, port); host.setConnectTimeout(connectTimeout).setSoTimeout(soTimeout); System.out.println("begin connect " + host.toString()); SocketClient client = new SocketClient(host); if (client.connect() == false) { System.out.println("connect " + host.toString() + " error"); return; } System.out.println("connect " + host.toString() + " ok"); if (testReadOneByte(client) == false) { client.close(); return; } if (testGetLine(client) == false) { client.close(); return; } if (testGetToken(client) == false) { client.close(); return; } try { client.getByLength(-1); } catch (Exception e) { // TODO: handle exception System.out.println("get length error"); } client.close(); byte[] buf = new byte[256]; buf[0] = '0'; buf[1] = '1'; buf[2] = '2'; String tmp = new String(buf, 0, 3); System.out.println("buf: " + buf.toString() + "; byte len: " + buf.length + "; toString len: " + buf.toString().length()); System.out.println("tmp: " + tmp + "; len: " + tmp.length()); tmp = new String(); System.out.println("tmp length: " + tmp.length()); } } |
|
返回顶楼 | |
发表时间:2014-11-30
icefishc 写道 好多年没看到java程序员 吐槽别人的代码风格了.
java程序员一般不都是被吐槽写的罗嗦老土么.... 哈哈,主要是java语法糖少。不像很多现代语言有大量符号语法。 |
|
返回顶楼 | |
发表时间:2014-12-10
icefishc 写道 好多年没看到java程序员 吐槽别人的代码风格了.
java程序员一般不都是被吐槽写的罗嗦老土么.... 不是啊,我觉得java的面向对象思想用好后效率极其高,只不过要是按照c的方法来写的话自然是啰嗦了。如果说java有不够好和啰嗦的地方的话,我认为应该是泛型做的不太好······ |
|
返回顶楼 | |
发表时间:2014-12-10
zsxxsz 写道 u013830484 写道 最近看公司的源码,早就知道初期的源码是一帮c语言的人勉强写的了,过不其然,就举个列子来看看c语言程序员在写java时候的守旧的思想吧··
ArrayList<TaskInfo> list = new ArrayList<TaskInfo>(); TaskInfo personal_task_info = new TaskInfo(); personal_task_info.mstrID = CONST_SEL_WELFARE; list.add(personal_task_info); personal_task_info = null; if(!UserInfoMgr.isTodaySignIn()) { personal_task_info = new TaskInfo(); personal_task_info.mstrID = CONST_PERSONAL_SIGNIN; list.add(personal_task_info); personal_task_info = null; } 两次personal_task_info = null;就把我弄醉了····· 给你贴一个真正的 C/C++ 程序员的JAVA代码: import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 日期对象与字符串对象相互转换类 * @Package com.net263.ccap.common.util * @File DateUtil.java * @date 2014-10-13 下午10:35:25 */ public class DateUtil { private static final Logger log = LoggerFactory .getLogger(DateUtil.class); /** * 将字符串类型的日期转为 Date 类型 * @param dateString 字符串类型的日期 * @return {Date} 返回 null 表示输入参数错误或转换出错 */ public static Date dateOf(String dateString, String dateFormat) { if (dateString == null || dateString.isEmpty()) return null; SimpleDateFormat format; if (dateFormat != null && !dateFormat.isEmpty()) format = new SimpleDateFormat(dateFormat); else format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date; try { date = format.parse(dateString); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("invalid date format: " + dateString); return null; } return date; } /** * 将 Date 类型的日期转为 String 类开 * @param date java.util.Date 类开的日期变量 * @return {String} 转换出错则返回 空的字符串对象 */ public static String stringOf(Date date, String dateFormat) { if (date == null) return new String(); SimpleDateFormat format; if (dateFormat != null && !dateFormat.isEmpty()) format = new SimpleDateFormat(dateFormat); else format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString; try { dateString = format.format(date); } catch (Exception e) { // TODO: handle exception log.error("invalid date: " + date); return new String(); } return dateString; } /** * 将 long 类型的日期转为 Date 类开 * @param date java.util.Date 类开的日期变量 * @return {String} 转换出错则返回 空的字符串对象 */ public static Date dateOf(long dateLong, String dateFormat){ SimpleDateFormat format; if (dateFormat != null && !dateFormat.isEmpty()) format = new SimpleDateFormat(dateFormat); else format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString=format.format(dateLong*1000); Date date=null; try { date=format.parse(dateString); } catch (ParseException e1) { e1.printStackTrace(); } return date; } /** * 将字符串格式的日期转为 1970 以来的毫秒数,如果要转成秒,则调用者需要自己 * 将该方法的返回值除以 1000 * @param dateString * @param dateFormat 日期格式:yyyy-MM-dd HH:mm:ss,当该参数为 null 时, * 则内部采用格式:yyyy-MM-dd HH:mm:ss * @return {long} 转换后的结果,返回值若为 -1 则表示出错 */ public static long timeOf(String dateString, String format) { if (format == null) format = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat dateFormat = new SimpleDateFormat(format); Date date; try { date = dateFormat.parse(dateString); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("invalid date: " + dateString + ", format: " + format); return -1; } long time = date.getTime(); return time; } } import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketException; import org.apache.axis.utils.ByteArrayOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.common.vo.HostVO; import com.exception.CcapException; import com.exception.ExceptionUtil; /** * 网络套接口基础通信类 * @Package com.common.socket * @File SocketClient.java * @author xxx@xxx.xxx * @date 2014-9-17 下午01:41:48 */ public class SocketClient implements Closeable { private static final Logger log = LoggerFactory .getLogger(SocketClient.class); private Socket socket = null; private HostVO host = null; public SocketClient(HostVO host) { this.host = host; } public HostVO getHost() { return host; } /** * 连接远程服务器,在进行网络读写之前必须先调用本函数连接远程服务器 * @return 连接服务器是否成功 */ public boolean connect() { socket = new Socket(); SocketAddress address = new InetSocketAddress(host.getIP(), host.getPort()); try { socket.setSoTimeout(host.getSoTimeout()); socket.setTcpNoDelay(true); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("setSoTimeout failed, host: " + host.toString()); socket = null; return false; } try { socket.connect(address, host.getConnectTimeout()); return true; } catch (IOException e) { // TODO Auto-generated catch block log.error("connect server error, host: " + host.toString()); e.printStackTrace(); try { if (socket.isConnected()) socket.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } socket = null; return false; } } /** * 关闭网络连接,调用 connect 成功后必须调用此函数关闭连接, * 否则会造成 文件描述符泄露问题 */ @Override public void close() { try { if (socket != null && socket.isConnected()) socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("close socket error"); } socket = null; } public Socket getSocket() { return socket; } public InputStream getInputStream() throws IOException { return socket.getInputStream(); } public OutputStream getOutPutStream() throws IOException { return socket.getOutputStream(); } /** * 读一个字节数据 * @return 返回所读字节的 ASCII 值,若返回值为 -1 则表示出错 */ public int readOneByte() { if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return -1; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getInputStream error, host: " + host.toString()); close(); return -1; } try { int ch = in.read(); return ch; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("read one byte error, host: " + host.toString()); close(); return -1; } } /** * 只读一次数据,所读到的数据长度不得超过限定值 * @param maxLength 所读数据的最大长度限制,即读到的数据长度不得超过此值, * 该值必须 > 0 * @return {String} 返回读到的数据,若返回 null 则表示读出错或读到 0 个字节 */ public String readOnce(int maxLength) { if (maxLength <= 0) { log.error("invalid maxLength: " + maxLength); throw new CcapException(ExceptionUtil.INVALID_PARAMS, "invalid maxLength: " + maxLength); } if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return null; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getInputStream error, host: " + host.toString()); close(); return null; } byte[] buf = new byte[maxLength]; int n; try { n = in.read(buf); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("read error, host: " + host.toString()); close(); return null; } if (n <= 0) { log.error("invalid read n: " + n + "; host: " + host.toString()); close(); return null; } try { return new String(buf, 0, n, "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 读一行数据 * @return 如果读出错则返回 null */ public String getLine() { if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return null; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getInputStream error, host: " + host.toString()); close(); return null; } BufferedReader reader; try { reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } String buf; try { buf = reader.readLine(); return buf; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("readline error, host: " + host.toString()); close(); return null; } } /** * 读以某个字符串为分隔符的数据 * @param tag 分隔符字符串 * @return 出错时返回 null;如果找到分隔符,则返回的数据中 不包含分隔串, * 仅返回数据部分;当读到的数据正好与分隔符相同时, 则 返回的 * String 对象的 length 为 0,即仅读到了分隔符 */ public String getByToken(String tag) { if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return null; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("get inputstream error, host: " + host.toString()); close(); return null; } byte[] token = tag.getBytes(); final int tagLen = token.length; byte[] buf = new byte[1024]; int nextPos = 0; for (;;) { try { byte ch = (byte) in.read(); if (ch == -1) { log.error("read error, tag: " + tag); return null; } // 如果缓冲区空间不足,则重新分配空间,将旧数据拷贝至新缓冲区 if (nextPos >= buf.length) { byte[] bufTmp = new byte[buf.length + 128]; System.arraycopy(buf, 0, bufTmp, 0, buf.length); buf = bufTmp; } buf[nextPos] = ch; // 先比较新读到字节与分隔符的最后一个字节是否相同 if (ch != token[tagLen - 1]) { nextPos++; continue; } // 从后向前比较剩余的字节是否相同 int i = tagLen - 2, currPos = nextPos - 1; nextPos++; while (currPos >= 0) { if (i <= 0) { if (nextPos == tagLen) return new String(); try { return new String(buf, 0, nextPos - tagLen, "UTF-8"); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } } // 如果有一个字节不同,则说明在当前已读数据中未读到分隔符 if (token[i] != buf[currPos]) break; i--; currPos--; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("read bye error, host: " + host.toString()); close(); return null; } } } /** * 读取指定长度的数据 * @param length 要求读到的数据长度,必须 > 0 * @return 返回 null 表示输入参数有错或读出错,未读到要求的长度 */ public String getByLength(int length) { ByteArrayOutputStream out = new ByteArrayOutputStream(); if (saveTo(out, length) == false) return null; byte[] buf = out.toByteArray(); try { out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("ByteArrayOutputStream close error"); return null; } try { return new String(buf, 0, length, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * 将指定长度的数据输出至流中,该方法要求必须读到规定字节长度的数据,否则将 * 返回 false * @param out 输出流句柄 * @param length 指定输出的长度 * @return {boolean} 返回 true 表示已经读到规定长度的数据并成功输出至输出流中, * 否则返回 false */ public boolean saveTo(OutputStream out, int length) { if (length <= 0) { log.warn("invalid length: " + length); throw new CcapException(ExceptionUtil.INVALID_PARAMS, "invalid length: " + length); } if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return false; } InputStream in; try { in = socket.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getInputStream error, host: " + host.toString()); close(); return false; } byte[] buffer = new byte[8192]; // 一边从输入流中读取数据,一边将数据输出至输出流中,直到达到目标数据大小 while (length > 0) { int n = length > buffer.length ? buffer.length : length; try { n = in.read(buffer, 0, n); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("read error, host: " + host.toString()); close(); return false; } if (n == -1) { log.error("read data failed, host: " + host.toString()); close(); return false; } // 将读到的数据输出至输出流中 try { out.write(buffer, 0, n); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("write data to outPutStream error"); close(); return false; } length -= n; } // 刷新输出流中的缓冲区数据 try { out.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("flush outPutStream error"); close(); return false; } return true; } /** * 发送数据 * @param buf 需要发送的数据,length 不能为 0 * @return {boolean} 发送是否成功 */ public boolean send(String buf) { if (socket == null || !socket.isConnected()) { log.error("server not connected, host: " + host.toString()); return false; } OutputStream out; try { out = socket.getOutputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("getOutputStream error, host: " + host.toString()); close(); return false; } try { out.write(buf.getBytes("utf-8")); out.flush(); return true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.error("write data error, host: " + host.toString()); close(); return false; } } // /////////////////////////////////////////////////////////////////////// public static boolean testReadOneByte(SocketClient client) { String data = "+OK\r\n"; if (client.send(data) == false) { System.out.println("send data error!"); return false; } int ch = client.readOneByte(); if (ch == -1) { System.out.println("read error!"); return false; } if (ch == '+') System.out.println("OK, find '+'"); else { System.out.println("error, not find '+'"); return false; } data = client.getByToken("\r\n"); if (data == null) { System.out.println("getByToken error"); return false; } System.out.println("token: " + data); return true; } public static boolean testGetLine(SocketClient client) { String data = "hello world!\r\n"; if (client.send(data) == false) { System.out.println("send data failed!"); return false; } data = client.getLine(); if (data == null) { System.out.println("getLine failed!"); return false; } System.out.println(data); return true; } public static boolean testGetToken(SocketClient client) { if (client.send("hello|name=value|\r\n") == false) { System.out.println("write filed!"); return false; } String data = client.getByToken("|"); if (data == null) { System.out.println("getByToken failed!"); return false; } System.out.println("first token: " + data); data = client.getByToken("|"); if (data == null) { System.out.println("getByToken failed!"); return false; } System.out.println("second token: " + data); data = client.getByToken("\r\n"); if (data == null) { System.out.println("getByToken failed!"); return false; } System.out.println("third getByToken(len:" + data.length() + "): " + data); return true; } public static void main(String[] args) { final String ip = "192.168.188.173"; int port = 8888; int connectTimeout = 1000; int soTimeout = 5000; HostVO host = new HostVO(ip, port); host.setConnectTimeout(connectTimeout).setSoTimeout(soTimeout); System.out.println("begin connect " + host.toString()); SocketClient client = new SocketClient(host); if (client.connect() == false) { System.out.println("connect " + host.toString() + " error"); return; } System.out.println("connect " + host.toString() + " ok"); if (testReadOneByte(client) == false) { client.close(); return; } if (testGetLine(client) == false) { client.close(); return; } if (testGetToken(client) == false) { client.close(); return; } try { client.getByLength(-1); } catch (Exception e) { // TODO: handle exception System.out.println("get length error"); } client.close(); byte[] buf = new byte[256]; buf[0] = '0'; buf[1] = '1'; buf[2] = '2'; String tmp = new String(buf, 0, 3); System.out.println("buf: " + buf.toString() + "; byte len: " + buf.length + "; toString len: " + buf.toString().length()); System.out.println("tmp: " + tmp + "; len: " + tmp.length()); tmp = new String(); System.out.println("tmp length: " + tmp.length()); } } 这····· |
|
返回顶楼 | |
发表时间:2014-12-24
多态的作用,list空了
|
|
返回顶楼 | |