How to Install and Configure INN under RedHat Linux by netkiller
news://news.9812.net
Example 4. NNTP JavaBean
package netkiller.network; /** * @Author 陈景峰(Netkiller) *@version **/ import java.net.*; import java.io.*; import java.util.*; import sun.misc.*; import javax.servlet.http.*; import netkiller.security.*; //javadoc -private -d doc -author -version NNTP.java public class NNTP { private boolean debug = false; private boolean isConnected = false; private static Socket sock = null; private BufferedReader reader = null; private PrintWriter writer = null; private static int port = 119; public final static String GB18030 = "GB18030"; public final static String UTF8 = "UTF-8"; public final static String GBK = "GBK"; private static final String encode = GB18030; //private static final String encode = "UTF-8"; //private static String host = "news.cdut.edu.cn"; private static String host = "news.newsfan.net"; //private static String host = "news.cn99.com"; //private static String server = "news.webking.com.cn"; private static int retryTimes = 0; private StringTokenizer st = null; //private Vector v = new Vector(); //private ArrayList al = new ArrayList(); private String buf = null; public NNTP(){ } public void setDebug(boolean bool){ this.debug = bool; } private void logs(Object obj){ System.err.println(obj); } /** * 连接服务器 **/ public void Connect(){ try{ sock = new Socket(host,port); sock.setSoTimeout(600000); //System.out.print(sock); reader = new BufferedReader(new InputStreamReader(sock.getInputStream(),encode)); writer = new PrintWriter(sock.getOutputStream(),true); }catch(Exception e){ e.printStackTrace(); } } /** * 连接服务器 * @param host 服务器地址,ip 或 域名 * @param port 端口 * @return boolean false / ture **/ public boolean Connect(String host,int port){ boolean isConnect = false; try{ sock = new Socket(host,port); sock.setSoTimeout(600000); //System.out.println(sock); reader = new BufferedReader(new InputStreamReader(sock.getInputStream(),encode)); writer = new PrintWriter(sock.getOutputStream(),true); if(sock != null){ isConnect = true; } } catch(java.net.UnknownHostException unknown){ unknown.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } return isConnect; } /** * 连接服务器 * @param host 服务器地址,ip 或 域名 ,端口默认119 * @return boolean false / ture **/ public boolean Connect(String host){ return Connect(host,119); //HttpServletRequest req; //HttpSession host = req.getSession().getAttribute(); //System.out.println((String)host.getAttribute("newshost")); //System.out.println((String)req.getSession().getAttribute("newshost")); } /** * 关闭socket and stream (连接与流) * @param * @return * @exception Cannot complete Session:Too many tries! **/ public void close()throws Exception{ try{ writer.println("QUIT"); /* while((buf = reader.readLine()) != null) { System.out.println(buf); } */ if(writer != null)writer.close(); if(reader != null)reader.close(); if(sock != null)sock.close(); if(retryTimes++ == 10) throw new Exception("Cannot complete Session:Too many tries!"); }catch(Exception ex){ } } /** * MODE reader * @param * @return void **/ public void setModeReader(){ //writer.flush(); writer.println("MODE reader"); if(debug){ //System.err.println(reader.readLine()); } } /** * 列出组列表 * @param * @return Vector * cn.comp.linux.development <br> * cn.comp.linux.install <br> * cn.comp.linux.admin <br> * cn.comp.linux.misc <br> * cn.comp.linux.application <br> * cn.comp.freebsd <br> * cn.comp.minix <br> * cn.comp.solaris.admin <br> * cn.comp.lang.c <br> * cn.comp.lang.php <br> * cn.comp.lang.perl <br> * cn.comp.lang.python <br> * cn.comp.lang.java.development <br> * cn.comp.lang.java.jsp <br> **/ public Vector getNewsList(){ Vector v = new Vector(); String tmp = null; int n = 1; try{ writer.println("LIST"); while((buf = reader.readLine()) != null) { if(debug){ System.err.println(buf); } if(n>2){ st = new StringTokenizer(buf); st.hasMoreTokens(); tmp = st.nextToken(" ").toString(); if(tmp.equals("."))break; //v.add(this.Base64Encoder(tmp)); v.add(tmp); st.nextToken(); } n++; } } catch(Exception e){ e.printStackTrace(); } finally{ try{ //this.close(); }catch(Exception e){ e.printStackTrace(); } } return v; } /** * 打开组 * @param newsgroup 新闻组 * @return boolean true 组存在,false 组不存在 * 使用方法: * getNewsList() * cn.comp.freebsd <br> * cn.comp.solaris.admin <br> * cn.comp.lang.c <br> * * setNewsGroup("cn.comp.freebsd") * @see getNewsList() **/ public boolean setNewsGroup(String newsgroup){ boolean isSuccess = false; try{ writer.println("GROUP "+newsgroup); //writer.println("\r\n"); //"group cn.comp.lang.c" //211 2 6 7 cn.comp.lang.php //501 newsgroup buf = reader.readLine(); if(buf.substring(0,3).equals("211")){ isSuccess = true; } }catch(Exception e){ e.printStackTrace(); } return isSuccess; } /** * 列出当前新闻组内的所有文章ID * @return ArrayList 文章ID * @see setNewsGroup(String newsgroup) **/ public ArrayList getNewsListGroup(){ ArrayList al = new ArrayList(); try{ writer.println("LISTGROUP"); //listgroup cn.comp.lang.c //211 Article list follows while((buf = reader.readLine()) != null) { if(buf.equals("."))break; } }catch(Exception e){ e.printStackTrace(); } return al; } /** * 列出 某 新闻组内的所有文章ID * @param newsgroup * @return ArrayList 文章ID * @see getNewsList() * @see setNewsGroup(String newsgroup) **/ public Vector getNewsListGroup(String newsgroup){ Vector v = new Vector(); boolean isAdd = false; int i =0; try{ buf = reader.readLine(); this.logs(buf); writer.println("LISTGROUP "+newsgroup); // writer.flush(); //System.err.println(writer.checkError()); //listgroup cn.comp.lang.c //211 Article list follows while((buf = reader.readLine()) != null) { //System.err.println("buffer:"+buf); if(buf.equals("."))break; //211 Article list follows //211 list of article numbers follow if(buf.length()>3){ if(buf.substring(0,3).equals("211")){ isAdd = true; continue; } if(buf.substring(0,3).equals("412")){ isAdd = false; System.err.println(buf +":"+ newsgroup); break; } if(buf.substring(0,3).equals("500")){ isAdd = false; System.err.println(buf); break; } } if(isAdd)v.add(buf); if(i++>50)break; } }catch(Exception e){ e.printStackTrace(); } return v; } /** * 通过文章ID取得Subject(标题) * @param Number 文章ID * @return String 文章标题 * @see getNewsListGroup() * @see getNewsListGroup(String newsgroup) **/ public String getNewsTitle(String Number){ String strTitle = ""; try{ writer.println("HEAD "+Number); //listgroup cn.comp.lang.c //211 Article list follows //buf = reader.readLine(); while((buf = reader.readLine()) != null) { if(buf.equals("."))break; if(buf.length()>8){ if(buf.substring(0,8).equals("Subject:")){ strTitle = buf.substring(9); } } } }catch(Exception e){ e.printStackTrace(); } return strTitle; } public HashMap getNewsTitle(Vector vector){ HashMap newsSubject = new HashMap(); try{ Enumeration enum = vector.elements(); while(enum.hasMoreElements()){ String id = (String)enum.nextElement(); reader.reset(); writer.println("HEAD "+id); while((buf = reader.readLine()) != null) { if(buf.equals("."))break; if(buf.length()>8){ if(buf.substring(0,8).equals("Subject:")){ newsSubject.put(id,buf.substring(9)); } } } } }catch(Exception e){ e.printStackTrace(); } return newsSubject; } /** * 返回文章信息头内容 * @param Number 文章ID * @return Vector 信息头 * <br> * Path: octopus!not-for-mail <br> * From: [email protected]<br> * Newsgroups: cn.comp.lang.c<br> * Subject: ■ web news 测试■<br> * Date: 3 Jul 2003 10:09:55 GMT<br> * Organization: Chengdu Univ. of Technology.<br> * Lines: 394<br> * Message-ID: <[email protected]><br> * NNTP-Posting-Host: 202.103.190.130<br> * X-Trace: octopus.cdut.edu.cn 1057226995 27398 202.103.190.130 (3 Jul 2003 10:09:55 GMT)<br> * X-Complaints-To: [email protected]<br> * NNTP-Posting-Date: 3 Jul 2003 10:09:55 GMT<br> * Xref: octopus cn.comp.lang.c:29 <br> * * @see getNewsListGroup() * @see getNewsListGroup(String newsgroup) **/ public Vector getNewsHead(String Number){ Vector vector = new Vector(); boolean sw = true; try{ writer.println("HEAD "+Number); buf = reader.readLine(); buf = reader.readLine(); while((buf = reader.readLine()) != null) { if(buf.equals("."))break; /* if(buf.length()>4 && !buf.substring(0,4).equals("Path") && sw){ sw = false; continue; }*/ vector.add(buf); } }catch(Exception e){ e.printStackTrace(); } return vector; } /* public String[][] getNewsHead(String Number){ Vector vector = new Vector(); String arrNewsHead[][] = new String[64][2]; StringTokenizer token = null; boolean sw = true; try{ writer.println("HEAD"); //listgroup cn.comp.lang.c for(int i=0;(buf = reader.readLine()) != null;i++) { if(buf.length()>4 && !buf.substring(0,4).equals("Path") && sw){ sw = false; continue; } if(buf.length()<3)break; token = new StringTokenizer(buf); //if(!token.hasMoreTokens())break; arrNewsHead[i][0] = token.hasMoreTokens()?(String)token.nextToken():""; arrNewsHead[i][1] = token.hasMoreTokens()?(String)token.nextToken():""; //System.out.print(arrNewsHead[i][0]); //System.out.println(arrNewsHead[i][1]); } }catch(Exception e){ e.printStackTrace(); } return arrNewsHead; } */ /** * 返回文章内容 * @param Number 文章ID * @return Vector 文章内容 * * @see getNewsListGroup() * @see getNewsListGroup(String newsgroup) **/ private Vector getNewsBody(String Number){ Vector v = new Vector(); String strTitle = ""; boolean isAdd = false; try{ writer.println("BODY "+Number); while((buf = reader.readLine()) != null) { if(buf.length()>3){ if(buf.substring(0,3).equals("222")){ isAdd = true; continue; } } if(buf.equals("."))break; if(isAdd)v.add(buf); } }catch(Exception e){ e.printStackTrace(); } return v; } /** * 返回文章内容 * @param Number 文章ID * @return Vector 文章内容 * * @see getNewsContent(String Number) * @see getNewsArticle(String Number) **/ public Vector getNewsContent(String Number){ return this.getNewsBody(Number); } /** * 返回文章全文内容 * @param Number 文章ID * @return Vector 文章全文内容 * * @see getNewsContent(String Number) **/ public Vector getNewsArticle(String Number){ Vector v = new Vector(); //article <[email protected]> //article 6 try{ writer.println("ARTICLE "+Number); buf = reader.readLine(); while((buf = reader.readLine()) != null) { if(buf.equals("."))break; //if(buf.equals("211 Article list follows")){} v.add(buf); } }catch(Exception e){ e.printStackTrace(); } return v; } /** * 下一篇文章 * @param * @return **/ public void setNewsNext(){ //223 6 <[email protected]> Article retrieved; request text separately. //421 No next to retrieve. try{ writer.println("NEXT"); //listgroup cn.comp.lang.c //while((buf = reader.readLine()) != null) { // buf.substring(0,3); //} }catch(Exception e){ e.printStackTrace(); } //return "1"; } /** * 发表新帖 * @param from 用户Email,回信地址 * @param group 组目的地 * @param subject 标题 * @param content 内容 * @return boolean true发贴成功,false 发贴失败 * <br>setPostNews("[email protected]","cn.comp.linux.admin","hi all test","chen \n chen \n 中国防大学!!!!! \n"); **/ public boolean setPostNews(String from,String group,String subject,String content){ boolean isSuccess = false; try{ setModeReader(); writer.println("POST"); writer.println("From: "+from); writer.println("Newsgroups: "+group); writer.println("Subject: "+subject); writer.println(""); writer.println(content); writer.println("."); writer.println("QUIT"); while((buf = reader.readLine()) != null) { if(buf.substring(0,3).equals("240")) isSuccess = true; //System.out.println("Article posted"); } }catch(Exception e){ e.printStackTrace(); } return isSuccess; } /** * 回复组 , 回复用户的帖子 * @param from 用户Email,回信地址 * @param group 组目的地 * @param subject 标题 * @param content 内容 * @param ref 参考Message-ID,就是原贴Message-ID * @return boolean true发贴成功,false 发贴失败 * <br>setPostNews("[email protected]","cn.comp.linux.admin","hi all test","chen \n chen \n 中国防大学!!!!! <br>","<[email protected]>"); * Message-ID: <[email protected]><br> * References: <[email protected]><br> **/ public boolean setReNews(String from,String group,String subject,String content,String ref){ boolean isSuccess = false; try{ setModeReader(); writer.println("POST"); writer.println("From: "+from); writer.println("Newsgroups: "+group); writer.println("Subject: "+subject); writer.println("References: "+ref); writer.println(""); writer.println(content); writer.println("."); writer.println("QUIT"); while((buf = reader.readLine()) != null) { if(buf.substring(0,3).equals("240")) isSuccess = true; //System.out.println("Article posted"); } }catch(Exception e){ e.printStackTrace(); } return isSuccess; } /** * 查看文章状态 * @param Number 文章ID * @return String 文件ID,Message-ID:,status **/ public String getNewsStat(String Number){ String stat = null; try{ setModeReader(); writer.println("STAT "+Number); while((buf = reader.readLine()) != null) { if(buf.substring(0,3).equals("223")){ stat = buf; System.out.println(buf); //System.out.println("Article posted"); } } }catch(Exception e){ e.printStackTrace(); } return stat; } /** * ISO-8859-1 ==> GBK **/ public String toUnicode(String in,String out,String strSource){ String strTarget = null; try{ strTarget = new String(strSource.getBytes(in),out); }catch(Exception e){ e.printStackTrace(); } return strTarget; } /** * ISO-8859-1 ==> GBK * @see toGBK(String strSource) **/ public static String toChinese(String strvalue) { try{ if(strvalue==null) return null; else { strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK"); return strvalue; } }catch(Exception e){ return null; } } /* public static void checkStatus(String msg) throws Exception { System.out.println(msg); if (msg.substring(0,3).equals("+OK")) return; else throw new Exception("Cannot Complete Session!"); } public static void performSession() throws Exception { if(retryTimes++ == 10) throw new Exception("Cannot complete Session:Too many tries!"); performSession(); } } */ public static String toUnicode(String value){ try{ if(value!=null) { value = new String(value.getBytes("ISO8859_1"), "UTF-8"); } }catch(Exception e){ return null; } return value; } public static final String Base64Encoder(String code) { String tmp = null; try{ tmp = new sun.misc.BASE64Encoder().encode(code.getBytes()); } catch(Exception e){ System.out.println(e.toString()); } return tmp; } public static final String Base64Decoder(String code) { String tmp = null; try{ tmp = new String(new sun.misc.BASE64Decoder().decodeBuffer(code)).toString(); } catch(Exception e){ System.out.println(e.toString()); } return tmp; } public static void main(String[] args) { try{ /* BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter writer = new BufferedWriter((System.out),true); //BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out),true); writer.print("Enter The POP3 Server:"); server = reader.readLine(); writer.print("Enter The Server Port (default is 110):"); String tmp = reader.readLine(); try{ port = Integer.parseInt(tmp); } catch(Exception e){ } writer.print("Enter Your Username:"); userid = reader.readLine(); writer.print("Enter Your Password:"); passwd = reader.readLine(); reader.close(); */ //performSession(); NNTP n = new NNTP(); n.setDebug(true); n.Connect(); Vector v = new Vector(); System.out.print(n.Connect("news.newsfan.net",119)); n.setModeReader(); v = n.getNewsList(); for(int i=0;i<v.size();i++){ System.out.println((String)v.get(i)); } //n.setNewsGroup("cn.comp.lang.python"); System.out.println(n.setNewsGroup("测试中文")); //System.out.println(n.getNewsStat("24")); //n.getNewsHead("24"); //ArrayList al = n.getNewsListGroup(); //v = n.getNewsListGroup("精华信区.计算机"); //v = n.getNewsListGroup("测试中文"); //v = n.getNewsListGroup("1950"); //Vector v = n.getNewsListGroup("cn.comp.linux.admin"); /* System.out.println(v.size()); for(int i=0;i<v.size();i++){ System.out.print(i+">"+(String)v.get(i)); //System.out.println(n.getNewsTitle((String)v.get(i))); }*/ /* for(int i=0;i<v.size();i++){ } */ //System.out.println(n.getNewsTitle("4370")); //Vector v = n.getNewsArticle("20"); //Vector v = n.getNewsArticle("24"); //Vector v = n.getNewsHead("33"); /* for(int i=0;i<v.size();i++){ System.out.println((String)v.get(i)); } */ //n.setPostNews("[email protected]","cn.comp.linux.admin","hi all test","chen \n chen \n 中国防大学!!!!! \n"); /* String head[][] =null; head = n.getNewsHead("24"); for(int i=0;i<head.length;i++){ System.out.print(head[i][0]); } */ n.close(); }catch (Exception e) { e.printStackTrace(); } System.out.println("Done"); } } |