import java.net.*; import java.util.*; public class pop3server{ private static final int SERVER_PORT=110; private static final int MAX_CLIENT=500; private ServerSocket listenSocket=null; private boolean keeprunning=true; private InetAddress ip; public static void main(String[] args){ pop3server server=new pop3server(); server.impserver(); } public void impserver(){ Socket clientSocket=null; try{ while(keeprunning){ clientSocket=listenSocket.accept(); int numThreads=Thread.activeCount(); System.out.println(numThreads); manageconnection newhandle=new manageconnection(clientSocket); Thread newhandlethread=new Thread(newhandle); newhandlethread.start(); System.out.println("hello"); } } catch(IOException excpt){ System.err.println("Sorry ,Failed I/O:"+excpt); } } public pop3server() { try{ listenSocket=new ServerSocket(SERVER_PORT,MAX_CLIENT); }catch(IOException excpt){ System.err.println("SOrry to open port "+SERVER_PORT+":"+excpt); System.exit(1); } } } /*follow is manage and process command class*/ class manageconnection implements Runnable{ private static final boolean AUTOFLUSH=true; private Socket mySocket=null; private PrintWriter out=null; private BufferedReader in=null; private boolean checkedpass=false; private int msgnum=0; private long[] msgsize=new long[100]; private long totalsize=0; private String username=null; public manageconnection(Socket newSocket){ mySocket=newSocket; } public void run(){ String nextline=null; String password; int check=0; int strlen; String content="Subject:hello"; String command=null; String auth_user="user"; String arg1; int arg2=0; String arg3; int i=0; int count=0; int time=0; try{Thread.currentThread().sleep(10); }catch(Exception e){ System.out.println(e); } try{ mySocket.setTcpNoDelay(true); time=mySocket.getSoTimeout(); }catch(SocketException excpt){ System.out.println(excpt); } try{ out=new PrintWriter(mySocket.getOutputStream(),AUTOFLUSH); in=new BufferedReader(new InputStreamReader(mySocket.getInputStream()) ); /*System.out.println("hello thread1");*/ out.println("+OK"+" TianHua‘s pop3 server"); try{ while(true){ if(check!=3){ try{ nextline=in.readLine();}catch(Exception excpt){ System.out.println("sorry:"+excpt); break; } System.out.println(count+" "+nextline); if(nextline.length()<4){ out.println("-ERR"); }else{ command=nextline.substring(0,4); if(command.equalsIgnoreCase("user")){ i=1; } if(command.equalsIgnoreCase("pass")){ i=2; } if(command.equalsIgnoreCase("stat")){ i=3; } if(command.equalsIgnoreCase("quit")){ i=4; } if(command.equalsIgnoreCase("list")){ i=5; } if(command.equalsIgnoreCase("retr")){ i=6; } if(command.equalsIgnoreCase("dele")){ i=7; } switch(i){ case 1:if(check==0){ check=1; if(nextline.length()<5){ out.println("-ERR"); }else{arg1=nextline.substring(5); username=arg1; out.println("+OK"); } }else{out.println("-ERR");} i=0; break; case 2:if(check==1){ if(nextline.length()<5){ out.println("-ERR"); }else{ arg1=nextline.substring(5); password=arg1; if(check(username,password)==‘1‘){ check=2; /*msgnum=readmail(username);*/ out.println("+OK");}else{ out.println("-ERR"+" sorry auth failed"); check=0;} } }else{out.println("-ERR");} i=0; break; case 3:if(check==2){ msgnum=readmail(username); out.println("+OK"+" "+msgnum+" "+totalsize); }else{ out.println("-ERR"); } i=0; break; case 4:out.println("+OK BYE BYE welcome to TianHua‘s Mail System next time"); check=3; i=0; break; case 5:if(check==2){ out.println("+OK"); out.println(msgnum+" "+totalsize); int ii,iii=0; for(ii=1;ii<=msgnum;ii++){ out.println(ii+" "+msgsize[iii]); iii++; } out.println("."); }else{ out.println("-ERR"); } i=0; break; case 6:if(check==2){ if(nextline.length()<5){ out.println("-ERR"); }else{ arg1=nextline.substring(5); out.println("+OK"); System.out.println(arg1); printmail(Integer.parseInt(arg1),username); out.print("\r\n"); out.print("."); out.print("\r\n"); boolean st=out.checkError(); System.out.println(st); /*if(nextline.length()<6){ out.println("-ERR"); }else{ try{ arg2=Integer.parseInt(nextline.substring(5)); }catch(NumberFormatException except) { out.println("-ERR"); break; } if(msgnum==0){ out.println("-ERR no msg retrived"); } if(arg2<=msgnum){ out.println("+OK"); out.println(content); out.println(""); out.print("."); out.println(); out.println("."); System.out.println("msg finished"); }else{ out.println("no such msg"); } }*/ } }else{out.println("-ERR"); } i=0; System.out.println("retr finished"); break; case 7:if(check==2){ out.println("+OK"); }else{ out.println("-ERR"); } i=0; break; default:out.println("-ERR"); i=0; break; } } }else{ out.close(); in.close(); mySocket.close(); break; } } }catch(NullPointerException excpt){ System.out.println("sorry "+excpt); in.close(); out.close(); mySocket.close(); } }catch(IOException excpt){ System.err.println("Failed I/O:"+excpt); } System.out.println("bye"); } private void printmail(int msgnumber,String uname){ String msgdir="/webmail/userinfo/"; String msgfile=msgdir+uname+"/"+Integer.toString(msgnumber); System.out.println(msgfile); long filepoint=0; try{ RandomAccessFile file=new RandomAccessFile(msgfile,"r"); long msglength=file.length(); while(filepoint<msglength){ String s=file.readLine(); out.println(s); try{ Thread.currentThread().sleep(5); }catch(Exception e){ System.out.println(e); } filepoint=file.getFilePointer(); } }catch(Exception e){ System.out.println(e); } } /*check your username and password*/ private char check(String user,String pass){ String[] arg=new String[2]; int c=0; char value=‘0‘; arg[0]="uname="+user; arg[1]="pass="+pass; try{ Process child=Runtime.getRuntime().exec("/disk2/ftp/pub/login" ,arg); InputStream inn =child.getInputStream(); while((c=inn.read())!=-1){ value=(char)c; } inn.close(); try{child.waitFor();}catch(InterruptedException e){ e.printStackTrace(); } }catch(IOException e){ System.err.println(e); } return value; } private int readmail(String uname){ String[] arg=new String[1]; arg[0]="username="+uname; int[] msg=new int[3]; int i=0,j=0; int msgnum=0; int c; try{ Process child=Runtime.getRuntime().exec("/disk2/ftp/pub/readmail", arg); InputStream inn =child.getInputStream(); while((c=inn.read())!=-1){ msg =c-48; i++; } inn.close(); try{child.waitFor();}catch(InterruptedException e){ e.printStackTrace(); } }catch(IOException e){ System.err.println(e); } for(j=0;j<=i;j++){ msgnum=msgnum+msg[j]; } System.out.println(msgnum); int k=0; try{ for(j=1;j<=msgnum;j++){ RandomAccessFile file=new RandomAccessFile("/webmail/userinfo/"+uname+ "/"+Integer.toString(j),"r"); msgsize[k]=file.length(); totalsize=msgsize[k]+totalsize; System.out.println(msgsize[k]); k++; } }catch(Exception e){ System.out.println(e); } System.out.println(totalsize); return msgnum; } } |
|