java

JavaMail发送带多个附件的邮件,多个收件人,多个抄送人

/** * 方法描述:发送带附件的邮件 * * @throws UnsupportedEncodingException */ public static boolean sendEmailWithAttachment(Email email) throws UnsupportedEncodingException { Properties prop = new Properties(); prop.put("mail.smtp.host", mailServer); prop.put("mail.smtp.auth", "true"); Authenticator auth = new MailAuthenticator(); Session session = Session.getDefaultInstance(prop, auth); Message message = new MimeMessage(session); boolean flag = false; try { message.setSubject(email.getEmail_subject());// 设置邮件主题 message.setHeader("Header:", email.getEmail_header()); // 设置邮件标题 message.setSentDate(new Date()); // 设置发送时间 Address addressFrom = new InternetAddress(mailAddress, mailAccount); // 设置发信人地址 message.setFrom(addressFrom); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.

多年前的一款页游《倾城》服务器源码分析

未完结版。业务逻辑代码 有点看不下去了,于是就放弃了。 1.网络层: 游戏代码中,网络服务器端 提供了两套实现,一套是SimpleNetServer,基于BIO(阻塞IO)的ServerSocket;另一套是NIONetServer,基于NIO(即非阻塞IO) selector模式的ServerSocketChannel。前者应该是用于开发期间的调试和测试;而后者用于实际生产环境。 比较两者关闭服务器的方式,前者是直接中断线程的,比较粗暴;后者是通过设置轮训字段字段(running)的状态来关闭的,更优雅、可靠。 其他细节,详见代码。 心跳消息:NIONetServer.run() -> NetConnection.update() NetConnection对client连接,以及收发消息的操作做了封装。并有两个子类继承之,其中SimpleConnection对应于SimpleNetServer,是BIO服务器端的网络连接对象;NIOConnection对应于NIONetServer,是NIO服务器端的网络连接对象。 消息解码器/编码器: Request消息NIO处理流程: 2.数据层 游戏把数据持久层和数据缓存层 合并为同一层了。所以这里就并为一层来一起讲解。 如果非要分数据持久层和cache层,DataAccessor算是主要提供了cache的实现。持久层提供了2种实现:LocalFileAccessor是将用户数据存放在本地文件系统中,以文本文件的形式存在,详见localdata\*或data\*,貌似data目录下的更齐全。目前源码中用到的是localdata。DatabaseAccessor是将用户数据存放到数据库中,读了GameServer.init()中提供了mysql和mssql两种数据库可选,而配置文件config\server.cfg中配置的是mssql数据库的数据源信息,而且还提供了mssql的驱动包。 DatabaseAccessor中,写数据库是异步的:创建一个包含jdbc sql语句和参数的job,放入队列中等待运行。对于插入操作,是先插入name,然后获取数据库生成的id,赋值到内存中,然后创建一个update job放入异步队列中等待更新。 这一层的源代码没有太多可圈可点之处,问题却是比较多,比如sql语句硬编码到源代码中,jdbc代码充斥于各个角落,导致代码冗余且难以维护;数据持久层仅仅使用了单个队列、单个线程处理,在某些情况下风险很高,例如单个job处理时间过长导致后续job没有机会及时运行,尤其是当队列严重阻塞、断电或宕机时后果最为严重;不能充分利用多核cpu的资源。

java 里面出现的 premGen space 的错误

http://www.cnblogs.com/xwdreamer/archive/2011/11/21/2296930.html 1.参考: http://blog.csdn.net/fox009/article/details/5633007 http://hi.baidu.com/like_dark/blog/item/19c1948b3292b0799f2fb468.html http://anyeeye.iteye.com/blog/444624 Tomcat6性能调优 出现java.lang.OutOfMemoryError: PermGen space http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/ 2.报错: Exception in thread "DispatcherThread" java.lang.OutOfMemoryError: PermGen space Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space Exception in thread "State Saver" java.lang.OutOfMemoryError: PermGen space Exception in thread "AWT-Windows" java.lang.OutOfMemoryError: OutOfMemoryError 3.原因: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 4.解决方法1: 手动设置MaxPermSize大小,如果是linux系统,修改TOMCAT_HOME/bin/catalina.sh,如果是windows系统,修改TOMCAT_HOME/bin/catalina.bat, 在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行: JAVA_OPTS=”-server -XX:PermSize=64M -XX:MaxPermSize=128m 建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。 5.解决方法2 修改eclipse.ini文件,修改如下: -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128M 如果还报错,可以考虑如下修改

PermGen space错误解决方法

1.参考: http://blog.csdn.net/fox009/article/details/5633007 http://hi.baidu.com/like_dark/blog/item/19c1948b3292b0799f2fb468.html http://anyeeye.iteye.com/blog/444624 Tomcat6性能调优 出现java.lang.OutOfMemoryError: PermGen space http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/ 2.报错: Exception in thread "DispatcherThread" java.lang.OutOfMemoryError: PermGen space Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space Exception in thread "State Saver" java.lang.OutOfMemoryError: PermGen space Exception in thread "AWT-Windows" java.lang.OutOfMemoryError: OutOfMemoryError 3.原因: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小 超过了jvm默认的大小(4M)那么就会产生此错误信息了。 4.解决方法1: 手动设置MaxPermSize大小,如果是linux系统,修改TOMCAT_HOME/bin/catalina.sh,如果是windows系统,修改TOMCAT_HOME/bin/catalina.bat, 在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行: JAVA_OPTS=”-server -XX:PermSize=64M -XX:MaxPermSize=128m 建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。 5.解决方法2 修改eclipse.ini文件,修改如下: -vmargs -Dosgi.

jfreechart 自定义饼图颜色

关键代码: private static class PieRenderer { private static final Paint[] COLORS = { Color.RED, Color.YELLOW, Color.GRAY, Color.MAGENTA, Color.ORANGE, Color.GREEN, Color.DARK_GRAY, Color.CYAN, Color.PINK, Color.BLUE, Color.LIGHT_GRAY }; public void setColor(PiePlot plot, CategoryDataset dataset) { List keys = dataset.getRowKeys(); for (int i = 0; i < keys.size(); i++) { plot.setSectionPaint(keys.get(i).toString(), COLORS[i % COLORS.length]); } } } PieRenderer renderer = new PieRenderer(); renderer.setColor(localPiePlot, paramCategoryDataset); 参考网站[url]http://balajinatarajan.blogspot.com/2008/04/customizing-jfreechart-pie-chart.html[/url] Introduction Dynamic representation of data in picture format is inevitable in this programming era.

网络爬虫当中暗网爬取初探

众所周知,网络爬虫的最基本原理就是模拟HTTP协议向指定网站发送请求,从而从服务器端返回的网页源代码中抽取具有实用价值的信息(也可能下一次任务队列的地址)。这中间涉及到很多算法,根据网站不同域名,网站网页更新速度,网站结构深度,设定爬虫不同的爬取策略。爬虫可以从一些简单的网站上直接获取网页源代码,从而对网页源代码进行分析。但是对于一些需要用户登录的网站,要抓取网站当中被保护的数据具有一定的困难。今天要说就是一个从需要登录的网站上获取收保护数据的方法。 按照现实生活中的方法,需要获取这些数据,我们首先需要登录这个网站,然后才能访问这个网站当中受保护的数据。好了,话题回来,我们想想,在服务器端网站是如何记录当前用户是否合法(是否已经登录了呢),很简单撒,session,这个我想是大家肯定都知道的方法了。原理很简单,我们访问一个网站,网站在我们首次访问的时候,会返回一个cookies信息。这个信息相当于我们在这个网站的一个登录信息。我们每次访问该网站的时候需要带上这个cookies信息,以便让该网站很容易的识别我们先前已经登录该网站了。 其实步骤很简单,我们需要访问该网站,获取和这个网站会话的cookies信息。然后带这个这个合法的cookies信息重新登录该网站,登录成功后,会在服务器端产生一个保存用户信息的session。以后我们只需每次访问该网站带上合法的cookies信息,服务器端会根据cookies来判别我们是否是合法用户(当前用户信息是否存在session当中)。如果合法我们就可以顺利获取该受保护的网站内容。 用java来实现一个简单的代码。从指定网站当中获取需要的cookies信息 URL url_con; HttpURLConnection http_con = null; try { url_con = new URL(url); http_con = (HttpURLConnection) url_con.openConnection(); //构造请求信息,对于安全性稍微高一些的网站,构造此类的请求头信息是必须的,第一次请求不带正确的cookies信息 http_con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)"); http_con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); http_con.setRequestProperty("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7"); http_con.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.5"); http_con.setRequestProperty("Host", "search.cnipr.com"); http_con.setRequestProperty("Accept-Encoding", "gzip,deflate"); http_con.setRequestProperty("Keep-Alive", "300"); http_con.setRequestProperty("Connection", "keep-alive"); http_con.setRequestProperty("Cookie", "cizi=2"); http_con.setRequestProperty("Referer","http://www.cnipr.com/top_js.htm"); //设置请求方式为get请求 http_con.setDoInput(true); http_con.setDoOutput(true); http_con.setRequestMethod("GET"); //建立和服务器之间的连接。 http_con.connect(); String cookieVal = http_con.getHeaderField("Set-Cookie"); //获取服务器端传回的jsessionId(对于使用tomcat内核的服务器一般传回此类值)值 if (cookieVal != null) { cookiesId = cookieVal.